diff --git a/src/common/lspLanguageFeatures.ts b/src/common/lspLanguageFeatures.ts index fcaf8f62..54ac8e4c 100644 --- a/src/common/lspLanguageFeatures.ts +++ b/src/common/lspLanguageFeatures.ts @@ -646,3 +646,85 @@ function toWorkspaceEdit(edit: lsTypes.WorkspaceEdit): languages.WorkspaceEdit { } //#endregion + +//#region DocumentSymbolAdapter + +export interface ILanguageWorkerWithDocumentSymbols { + findDocumentSymbols(uri: string): Promise; +} + +export class DocumentSymbolAdapter + implements languages.DocumentSymbolProvider +{ + constructor(private readonly _worker: WorkerAccessor) {} + + public provideDocumentSymbols( + model: editor.IReadOnlyModel, + token: CancellationToken + ): Promise { + const resource = model.uri; + + return this._worker(resource) + .then((worker) => worker.findDocumentSymbols(resource.toString())) + .then((items) => { + if (!items) { + return; + } + return items.map((item) => ({ + name: item.name, + detail: '', + containerName: item.containerName, + kind: toSymbolKind(item.kind), + range: toRange(item.location.range), + selectionRange: toRange(item.location.range), + tags: [] + })); + }); + } +} + +function toSymbolKind(kind: lsTypes.SymbolKind): languages.SymbolKind { + let mKind = languages.SymbolKind; + + switch (kind) { + case lsTypes.SymbolKind.File: + return mKind.Array; + case lsTypes.SymbolKind.Module: + return mKind.Module; + case lsTypes.SymbolKind.Namespace: + return mKind.Namespace; + case lsTypes.SymbolKind.Package: + return mKind.Package; + case lsTypes.SymbolKind.Class: + return mKind.Class; + case lsTypes.SymbolKind.Method: + return mKind.Method; + case lsTypes.SymbolKind.Property: + return mKind.Property; + case lsTypes.SymbolKind.Field: + return mKind.Field; + case lsTypes.SymbolKind.Constructor: + return mKind.Constructor; + case lsTypes.SymbolKind.Enum: + return mKind.Enum; + case lsTypes.SymbolKind.Interface: + return mKind.Interface; + case lsTypes.SymbolKind.Function: + return mKind.Function; + case lsTypes.SymbolKind.Variable: + return mKind.Variable; + case lsTypes.SymbolKind.Constant: + return mKind.Constant; + case lsTypes.SymbolKind.String: + return mKind.String; + case lsTypes.SymbolKind.Number: + return mKind.Number; + case lsTypes.SymbolKind.Boolean: + return mKind.Boolean; + case lsTypes.SymbolKind.Array: + return mKind.Array; + } + return mKind.Function; +} + +//#endregion diff --git a/src/css/cssMode.ts b/src/css/cssMode.ts index 018ee8b2..5c86d13c 100644 --- a/src/css/cssMode.ts +++ b/src/css/cssMode.ts @@ -66,7 +66,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerDocumentSymbolProvider( languageId, - new languageFeatures.DocumentSymbolAdapter(worker) + new languageFeatures.CSSDocumentSymbolAdapter(worker) ) ); } diff --git a/src/css/languageFeatures.ts b/src/css/languageFeatures.ts index d3fe9c26..ceda9ce6 100644 --- a/src/css/languageFeatures.ts +++ b/src/css/languageFeatures.ts @@ -18,7 +18,8 @@ import { DocumentHighlightAdapter, DefinitionAdapter, ReferenceAdapter, - RenameAdapter + RenameAdapter, + DocumentSymbolAdapter } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -47,79 +48,7 @@ export class CSSReferenceAdapter extends ReferenceAdapter {} export class CSSRenameAdapter extends RenameAdapter {} -// --- document symbols ------ - -function toSymbolKind(kind: lsTypes.SymbolKind): languages.SymbolKind { - let mKind = languages.SymbolKind; - - switch (kind) { - case lsTypes.SymbolKind.File: - return mKind.Array; - case lsTypes.SymbolKind.Module: - return mKind.Module; - case lsTypes.SymbolKind.Namespace: - return mKind.Namespace; - case lsTypes.SymbolKind.Package: - return mKind.Package; - case lsTypes.SymbolKind.Class: - return mKind.Class; - case lsTypes.SymbolKind.Method: - return mKind.Method; - case lsTypes.SymbolKind.Property: - return mKind.Property; - case lsTypes.SymbolKind.Field: - return mKind.Field; - case lsTypes.SymbolKind.Constructor: - return mKind.Constructor; - case lsTypes.SymbolKind.Enum: - return mKind.Enum; - case lsTypes.SymbolKind.Interface: - return mKind.Interface; - case lsTypes.SymbolKind.Function: - return mKind.Function; - case lsTypes.SymbolKind.Variable: - return mKind.Variable; - case lsTypes.SymbolKind.Constant: - return mKind.Constant; - case lsTypes.SymbolKind.String: - return mKind.String; - case lsTypes.SymbolKind.Number: - return mKind.Number; - case lsTypes.SymbolKind.Boolean: - return mKind.Boolean; - case lsTypes.SymbolKind.Array: - return mKind.Array; - } - return mKind.Function; -} - -export class DocumentSymbolAdapter implements languages.DocumentSymbolProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideDocumentSymbols( - model: editor.IReadOnlyModel, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => worker.findDocumentSymbols(resource.toString())) - .then((items) => { - if (!items) { - return; - } - return items.map((item) => ({ - name: item.name, - detail: '', - containerName: item.containerName, - kind: toSymbolKind(item.kind), - range: toRange(item.location.range), - selectionRange: toRange(item.location.range), - tags: [] - })); - }); - } -} +export class CSSDocumentSymbolAdapter extends DocumentSymbolAdapter {} export class DocumentColorAdapter implements languages.DocumentColorProvider { constructor(private _worker: WorkerAccessor) {} diff --git a/src/html/htmlMode.ts b/src/html/htmlMode.ts index b3998b69..a28c37ea 100644 --- a/src/html/htmlMode.ts +++ b/src/html/htmlMode.ts @@ -36,7 +36,7 @@ export function setupMode1(defaults: LanguageServiceDefaults): void { ); languages.registerDocumentSymbolProvider( languageId, - new languageFeatures.DocumentSymbolAdapter(worker) + new languageFeatures.HTMLDocumentSymbolAdapter(worker) ); languages.registerSelectionRangeProvider( languageId, @@ -103,7 +103,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerDocumentSymbolProvider( languageId, - new languageFeatures.DocumentSymbolAdapter(worker) + new languageFeatures.HTMLDocumentSymbolAdapter(worker) ) ); } diff --git a/src/html/languageFeatures.ts b/src/html/languageFeatures.ts index ce13d3ab..c94e52b1 100644 --- a/src/html/languageFeatures.ts +++ b/src/html/languageFeatures.ts @@ -21,7 +21,8 @@ import { CompletionAdapter, HoverAdapter, DocumentHighlightAdapter, - RenameAdapter + RenameAdapter, + DocumentSymbolAdapter } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -40,79 +41,7 @@ export class HTMLDocumentHighlightAdapter extends DocumentHighlightAdapter {} -// --- document symbols ------ - -function toSymbolKind(kind: lsTypes.SymbolKind): languages.SymbolKind { - let mKind = languages.SymbolKind; - - switch (kind) { - case lsTypes.SymbolKind.File: - return mKind.Array; - case lsTypes.SymbolKind.Module: - return mKind.Module; - case lsTypes.SymbolKind.Namespace: - return mKind.Namespace; - case lsTypes.SymbolKind.Package: - return mKind.Package; - case lsTypes.SymbolKind.Class: - return mKind.Class; - case lsTypes.SymbolKind.Method: - return mKind.Method; - case lsTypes.SymbolKind.Property: - return mKind.Property; - case lsTypes.SymbolKind.Field: - return mKind.Field; - case lsTypes.SymbolKind.Constructor: - return mKind.Constructor; - case lsTypes.SymbolKind.Enum: - return mKind.Enum; - case lsTypes.SymbolKind.Interface: - return mKind.Interface; - case lsTypes.SymbolKind.Function: - return mKind.Function; - case lsTypes.SymbolKind.Variable: - return mKind.Variable; - case lsTypes.SymbolKind.Constant: - return mKind.Constant; - case lsTypes.SymbolKind.String: - return mKind.String; - case lsTypes.SymbolKind.Number: - return mKind.Number; - case lsTypes.SymbolKind.Boolean: - return mKind.Boolean; - case lsTypes.SymbolKind.Array: - return mKind.Array; - } - return mKind.Function; -} - -export class DocumentSymbolAdapter implements languages.DocumentSymbolProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideDocumentSymbols( - model: editor.IReadOnlyModel, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => worker.findDocumentSymbols(resource.toString())) - .then((items) => { - if (!items) { - return; - } - return items.map((item) => ({ - name: item.name, - detail: '', - containerName: item.containerName, - kind: toSymbolKind(item.kind), - range: toRange(item.location.range), - selectionRange: toRange(item.location.range), - tags: [] - })); - }); - } -} +export class HTMLDocumentSymbolAdapter extends DocumentSymbolAdapter {} export class DocumentLinkAdapter implements languages.LinkProvider { constructor(private _worker: WorkerAccessor) {} diff --git a/src/json/jsonMode.ts b/src/json/jsonMode.ts index d962cbb2..64b91abc 100644 --- a/src/json/jsonMode.ts +++ b/src/json/jsonMode.ts @@ -59,7 +59,7 @@ export function setupMode(defaults: LanguageServiceDefaults): IDisposable { providers.push( languages.registerDocumentSymbolProvider( languageId, - new languageFeatures.DocumentSymbolAdapter(worker) + new languageFeatures.JSONDocumentSymbolAdapter(worker) ) ); } diff --git a/src/json/languageFeatures.ts b/src/json/languageFeatures.ts index f7b7fd10..e835613f 100644 --- a/src/json/languageFeatures.ts +++ b/src/json/languageFeatures.ts @@ -21,7 +21,8 @@ import { toTextEdit, fromRange, CompletionAdapter, - HoverAdapter + HoverAdapter, + DocumentSymbolAdapter } from '../common/lspLanguageFeatures'; export interface WorkerAccessor { @@ -59,88 +60,7 @@ export class JSONCompletionAdapter extends CompletionAdapter { export class JSONHoverAdapter extends HoverAdapter {} -// --- definition ------ - -function toLocation(location: lsTypes.Location): languages.Location { - return { - uri: Uri.parse(location.uri), - range: toRange(location.range) - }; -} - -// --- document symbols ------ - -function toSymbolKind(kind: lsTypes.SymbolKind): languages.SymbolKind { - let mKind = languages.SymbolKind; - - switch (kind) { - case lsTypes.SymbolKind.File: - return mKind.Array; - case lsTypes.SymbolKind.Module: - return mKind.Module; - case lsTypes.SymbolKind.Namespace: - return mKind.Namespace; - case lsTypes.SymbolKind.Package: - return mKind.Package; - case lsTypes.SymbolKind.Class: - return mKind.Class; - case lsTypes.SymbolKind.Method: - return mKind.Method; - case lsTypes.SymbolKind.Property: - return mKind.Property; - case lsTypes.SymbolKind.Field: - return mKind.Field; - case lsTypes.SymbolKind.Constructor: - return mKind.Constructor; - case lsTypes.SymbolKind.Enum: - return mKind.Enum; - case lsTypes.SymbolKind.Interface: - return mKind.Interface; - case lsTypes.SymbolKind.Function: - return mKind.Function; - case lsTypes.SymbolKind.Variable: - return mKind.Variable; - case lsTypes.SymbolKind.Constant: - return mKind.Constant; - case lsTypes.SymbolKind.String: - return mKind.String; - case lsTypes.SymbolKind.Number: - return mKind.Number; - case lsTypes.SymbolKind.Boolean: - return mKind.Boolean; - case lsTypes.SymbolKind.Array: - return mKind.Array; - } - return mKind.Function; -} - -export class DocumentSymbolAdapter implements languages.DocumentSymbolProvider { - constructor(private _worker: WorkerAccessor) {} - - public provideDocumentSymbols( - model: editor.IReadOnlyModel, - token: CancellationToken - ): Promise { - const resource = model.uri; - - return this._worker(resource) - .then((worker) => worker.findDocumentSymbols(resource.toString())) - .then((items) => { - if (!items) { - return; - } - return items.map((item) => ({ - name: item.name, - detail: '', - containerName: item.containerName, - kind: toSymbolKind(item.kind), - range: toRange(item.location.range), - selectionRange: toRange(item.location.range), - tags: [] - })); - }); - } -} +export class JSONDocumentSymbolAdapter extends DocumentSymbolAdapter {} function fromFormattingOptions(options: languages.FormattingOptions): lsTypes.FormattingOptions { return {