diff --git a/src/extension.ts b/src/extension.ts index ce879d6ab..3dd9141fb 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -22,6 +22,7 @@ import { TelemetryFeature } from './features/telemetry'; import { ShowReferencesFeature } from './features/showReferences'; import { CustomSemanticTokens } from './features/semanticTokens'; import { ModuleProvidersFeature } from './features/moduleProviders'; +import { ModuleCallsFeature } from './features/moduleCalls'; const id = 'terraform'; const brand = `HashiCorp Terraform`; @@ -133,11 +134,13 @@ export async function activate(context: vscode.ExtensionContext): Promise } }); - const moduleDataProvider = new ModuleProvidersDataProvider(context, client); + const moduleProvidersDataProvider = new ModuleProvidersDataProvider(context, client); + const moduleCallsDataProvider = new ModuleCallsDataProvider(context, client); const features: StaticFeature[] = [ new CustomSemanticTokens(client, manifest), - new ModuleProvidersFeature(client, moduleDataProvider), + new ModuleProvidersFeature(client, moduleProvidersDataProvider), + new ModuleCallsFeature(client, moduleCallsDataProvider), ]; if (vscode.env.isTelemetryEnabled) { features.push(new TelemetryFeature(client, reporter)); @@ -171,8 +174,8 @@ export async function activate(context: vscode.ExtensionContext): Promise await execWorkspaceCommand(client, requestParams); } }), - vscode.window.registerTreeDataProvider('terraform.modules', new ModuleCallsDataProvider(context, client)), - vscode.window.registerTreeDataProvider('terraform.providers', moduleDataProvider), + vscode.window.registerTreeDataProvider('terraform.modules', moduleCallsDataProvider), + vscode.window.registerTreeDataProvider('terraform.providers', moduleProvidersDataProvider), vscode.window.onDidChangeVisibleTextEditors(async (editors: readonly vscode.TextEditor[]) => { const textEditor = editors.find((ed) => !!ed.viewColumn); if (textEditor?.document === undefined) { diff --git a/src/features/moduleCalls.ts b/src/features/moduleCalls.ts new file mode 100644 index 000000000..032d187ea --- /dev/null +++ b/src/features/moduleCalls.ts @@ -0,0 +1,37 @@ +import * as vscode from 'vscode'; +import { BaseLanguageClient, ClientCapabilities, ServerCapabilities, StaticFeature } from 'vscode-languageclient'; +import { ModuleCallsDataProvider } from '../providers/moduleCalls'; +import { ExperimentalClientCapabilities } from './types'; + +const CLIENT_MODULE_CALLS_CMD_ID = 'client.refreshModuleCalls'; + +export class ModuleCallsFeature implements StaticFeature { + private disposables: vscode.Disposable[] = []; + + constructor(private client: BaseLanguageClient, private view: ModuleCallsDataProvider) {} + + public fillClientCapabilities(capabilities: ClientCapabilities & ExperimentalClientCapabilities): void { + if (!capabilities['experimental']) { + capabilities['experimental'] = {}; + } + capabilities['experimental']['refreshModuleCallsCommandId'] = CLIENT_MODULE_CALLS_CMD_ID; + } + + public async initialize(capabilities: ServerCapabilities): Promise { + if (!capabilities.experimental?.refreshModuleCalls) { + console.log('Server does not support client.refreshModuleCalls'); + return; + } + + await this.client.onReady(); + + const d = this.client.onRequest(CLIENT_MODULE_CALLS_CMD_ID, () => { + this.view?.refresh(); + }); + this.disposables.push(d); + } + + public dispose(): void { + this.disposables.forEach((d: vscode.Disposable) => d.dispose()); + } +} diff --git a/src/features/moduleProviders.ts b/src/features/moduleProviders.ts index 97f0159a4..8d2e02c63 100644 --- a/src/features/moduleProviders.ts +++ b/src/features/moduleProviders.ts @@ -14,7 +14,7 @@ export class ModuleProvidersFeature implements StaticFeature { if (!capabilities['experimental']) { capabilities['experimental'] = {}; } - capabilities['experimental']['refereshModuleProvidersCommandId'] = CLIENT_MODULE_PROVIDERS_CMD_ID; + capabilities['experimental']['refreshModuleProvidersCommandId'] = CLIENT_MODULE_PROVIDERS_CMD_ID; } public async initialize(capabilities: ServerCapabilities): Promise { diff --git a/src/features/types.ts b/src/features/types.ts index 2c780b8fe..df867b012 100644 --- a/src/features/types.ts +++ b/src/features/types.ts @@ -5,6 +5,7 @@ export interface ExperimentalClientCapabilities { experimental: { telemetryVersion?: number; showReferencesCommandId?: string; - refereshModuleProvidersCommandId?: string; + refreshModuleProvidersCommandId?: string; + refreshModuleCallsCommandId?: string; }; }