summaryrefslogtreecommitdiff
path: root/tools/astro-languageserver/src/plugins/PluginHost.ts
diff options
context:
space:
mode:
authorGravatar Matthew Phillips <matthew@matthewphillips.info> 2021-05-20 13:02:46 -0400
committerGravatar GitHub <noreply@github.com> 2021-05-20 13:02:46 -0400
commit6ce068b838a165c65898b5581f7508b75e256efc (patch)
tree998e1f1cbaf5eadcd9b88a91fd68700ba89bb4a8 /tools/astro-languageserver/src/plugins/PluginHost.ts
parent3da2b58b9d1392739e136d406e4148f846f0cec1 (diff)
downloadastro-6ce068b838a165c65898b5581f7508b75e256efc.tar.gz
astro-6ce068b838a165c65898b5581f7508b75e256efc.tar.zst
astro-6ce068b838a165c65898b5581f7508b75e256efc.zip
Get definitions (#219)
* Start on css completion * Support for CSS completions * Adds support for Go to Definition in TypeScript in Astro * Run formatting
Diffstat (limited to 'tools/astro-languageserver/src/plugins/PluginHost.ts')
-rw-r--r--tools/astro-languageserver/src/plugins/PluginHost.ts30
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);