diff options
Diffstat (limited to 'tools/astro-languageserver/src/plugins/PluginHost.ts')
-rw-r--r-- | tools/astro-languageserver/src/plugins/PluginHost.ts | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/tools/astro-languageserver/src/plugins/PluginHost.ts b/tools/astro-languageserver/src/plugins/PluginHost.ts index 8d59c9c93..3741845c4 100644 --- a/tools/astro-languageserver/src/plugins/PluginHost.ts +++ b/tools/astro-languageserver/src/plugins/PluginHost.ts @@ -1,4 +1,4 @@ -import { CompletionContext, CompletionItem, CompletionList, Position, TextDocumentIdentifier } from 'vscode-languageserver'; +import { CompletionContext, CompletionItem, CompletionList, DefinitionLink, Location, Position, TextDocumentIdentifier } from 'vscode-languageserver'; import type { DocumentManager } from '../core/documents'; import type * as d from './interfaces'; import { flatten } from '../utils'; @@ -10,11 +10,24 @@ enum ExecuteMode { Collect, } +interface PluginHostConfig { + filterIncompleteCompletions: boolean; + definitionLinkSupport: boolean; +} + export class PluginHost { private plugins: d.Plugin[] = []; + private pluginHostConfig: PluginHostConfig = { + filterIncompleteCompletions: true, + definitionLinkSupport: false, + }; constructor(private documentsManager: DocumentManager) {} + initialize(pluginHostConfig: PluginHostConfig) { + this.pluginHostConfig = pluginHostConfig; + } + register(plugin: d.Plugin) { this.plugins.push(plugin); } @@ -67,6 +80,21 @@ export class PluginHost { return foldingRanges; } + async getDefinitions(textDocument: TextDocumentIdentifier, position: Position): Promise<DefinitionLink[] | Location[]> { + const document = this.getDocument(textDocument.uri); + if (!document) { + throw new Error('Cannot call methods on an unopened document'); + } + + const definitions = flatten(await this.execute<DefinitionLink[]>('getDefinitions', [document, position], ExecuteMode.Collect)); + + if (this.pluginHostConfig.definitionLinkSupport) { + return definitions; + } else { + return definitions.map((def) => <Location>{ range: def.targetSelectionRange, uri: def.targetUri }); + } + } + onWatchFileChanges(onWatchFileChangesParams: any[]): void { for (const support of this.plugins) { support.onWatchFileChanges?.(onWatchFileChangesParams); |