From 64b76a5833b7254c3f4864b8484a06a3a640d4a8 Mon Sep 17 00:00:00 2001 From: James Pogran Date: Thu, 18 Jan 2024 13:41:53 -0500 Subject: [PATCH 1/6] Improve moduleProviders and moduleCalls welcome views This commit improves the welcome views for moduleProviders and moduleCalls by adding context variables to the views. This allows us to show different messages depending on the state of the open file inside the tree views. --- package.json | 36 +++++++++++++++++++++-- src/features/moduleCalls.ts | 3 ++ src/features/moduleProviders.ts | 3 ++ src/providers/moduleCalls.ts | 46 +++++++++++++++++++++-------- src/providers/moduleProviders.ts | 50 +++++++++++++++++++++++--------- src/terraform.ts | 2 +- 6 files changed, 112 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 4f0aa328d..695176d7d 100644 --- a/package.json +++ b/package.json @@ -752,11 +752,43 @@ "viewsWelcome": [ { "view": "terraform.providers", - "contents": "The active editor cannot provide information about installed providers. [Learn more about providers](https://www.terraform.io/docs/language/providers/index.html). You may need to update your language server version." + "contents": "There are no open Terraform files. Please open a Terraform configuration file to see installed providers.", + "when": "terraform.providers.documentOpened === false" + }, + { + "view": "terraform.providers", + "contents": "The active document is not a Terraform file. Please open a Terraform configuration file to see installed providers.", + "when": "terraform.providers.documentIsTerraform === false" + }, + { + "view": "terraform.providers", + "contents": "There are no installed providers found for the current open file.\n[Learn more about providers](https://www.terraform.io/docs/language/modules/develop/index.html)", + "when": "terraform.providers.noProviders === true" + }, + { + "view": "terraform.providers", + "contents": "The active editor cannot provide information about installed providers.\n[Learn more about providers](https://www.terraform.io/docs/language/providers/index.html)", + "when": "terraform.providers.noResponse === true" + }, + { + "view": "terraform.modules", + "contents": "There are no open Terraform files. Please open a Terraform configuration file to see installed modules.", + "when": "terraform.modules.documentOpened === false" + }, + { + "view": "terraform.modules", + "contents": "The active document is not a Terraform file. Please open a Terraform configuration file to see installed modules.", + "when": "terraform.modules.documentIsTerraform === false" + }, + { + "view": "terraform.modules", + "contents": "There are no installed modules found for the current open file.\n[Learn more about modules](https://www.terraform.io/docs/language/modules/develop/index.html)", + "when": "terraform.modules.noModules === true" }, { "view": "terraform.modules", - "contents": "The active editor cannot provide information about installed modules. [Learn more about modules](https://www.terraform.io/docs/language/modules/develop/index.html) You may need to run 'terraform get' or update your language server version." + "contents": "The active editor cannot provide information about installed modules.\n[Learn more about modules](https://www.terraform.io/docs/language/modules/develop/index.html)", + "when": "terraform.modules.noResponse === true" }, { "view": "terraform.cloud.workspaces", diff --git a/src/features/moduleCalls.ts b/src/features/moduleCalls.ts index 541203726..ba6c94697 100644 --- a/src/features/moduleCalls.ts +++ b/src/features/moduleCalls.ts @@ -39,9 +39,12 @@ export class ModuleCallsFeature implements StaticFeature { if (!capabilities.experimental?.refreshModuleCalls) { console.log('Server does not support client.refreshModuleCalls'); + await vscode.commands.executeCommand('setContext', 'terraform.modules.supported', false); return; } + await vscode.commands.executeCommand('setContext', 'terraform.modules.supported', true); + const d = this.client.onRequest(CLIENT_MODULE_CALLS_CMD_ID, () => { this.view?.refresh(); }); diff --git a/src/features/moduleProviders.ts b/src/features/moduleProviders.ts index ac1dce16f..bdec3fb12 100644 --- a/src/features/moduleProviders.ts +++ b/src/features/moduleProviders.ts @@ -39,9 +39,12 @@ export class ModuleProvidersFeature implements StaticFeature { if (!capabilities.experimental?.refreshModuleProviders) { console.log("Server doesn't support client.refreshModuleProviders"); + await vscode.commands.executeCommand('setContext', 'terraform.providers.supported', false); return; } + await vscode.commands.executeCommand('setContext', 'terraform.providers.supported', true); + const d = this.client.onRequest(CLIENT_MODULE_PROVIDERS_CMD_ID, () => { this.view?.refresh(); }); diff --git a/src/providers/moduleCalls.ts b/src/providers/moduleCalls.ts index 07d6d8429..9b67cd1e8 100644 --- a/src/providers/moduleCalls.ts +++ b/src/providers/moduleCalls.ts @@ -76,15 +76,9 @@ export class ModuleCallsDataProvider implements vscode.TreeDataProvider { - const activeEditor = getActiveTextEditor(); - - if (!isTerraformFile(activeEditor?.document)) { - return; - } - - if (event && activeEditor) { - this.refresh(); - } + // most of the time this is called when the user switches tabs or closes the file + // we already check for state inside the getModule function, so we can just call refresh here + this.refresh(); }), ); } @@ -109,26 +103,48 @@ export class ModuleCallsDataProvider implements vscode.TreeDataProvider { const activeEditor = getActiveTextEditor(); + await vscode.commands.executeCommand('setContext', 'terraform.modules.documentOpened', true); + await vscode.commands.executeCommand('setContext', 'terraform.modules.documentIsTerraform', true); + await vscode.commands.executeCommand('setContext', 'terraform.modules.lspConnected', true); + await vscode.commands.executeCommand('setContext', 'terraform.modules.noResponse', false); + await vscode.commands.executeCommand('setContext', 'terraform.modules.noModules', false); + if (activeEditor?.document === undefined) { + // there is no open document + await vscode.commands.executeCommand('setContext', 'terraform.modules.documentOpened', false); return []; } if (!isTerraformFile(activeEditor.document)) { + // the open file is not a terraform file + await vscode.commands.executeCommand('setContext', 'terraform.modules.documentIsTerraform', false); return []; } - const editor = activeEditor.document.uri; - const documentURI = Utils.dirname(editor); if (this.client === undefined) { + // connection to terraform-ls failed + await vscode.commands.executeCommand('setContext', 'terraform.modules.lspConnected', false); return []; } + const editor = activeEditor.document.uri; + const documentURI = Utils.dirname(editor); + + let response: terraform.ModuleCallsResponse; try { - const response = await terraform.moduleCalls(documentURI.toString(), this.client, this.reporter); + response = await terraform.moduleCalls(documentURI.toString(), this.client, this.reporter); if (response === null) { + // no response from terraform-ls + await vscode.commands.executeCommand('setContext', 'terraform.modules.noResponse', true); return []; } + } catch { + // error from terraform-ls + await vscode.commands.executeCommand('setContext', 'terraform.modules.noResponse', true); + return []; + } + try { const list = response.module_calls.map((m) => { return this.toModuleCall( m.name, @@ -141,8 +157,14 @@ export class ModuleCallsDataProvider implements vscode.TreeDataProvider this.refresh()), vscode.window.onDidChangeActiveTextEditor(async (event: vscode.TextEditor | undefined) => { - const activeEditor = getActiveTextEditor(); - - if (!isTerraformFile(activeEditor?.document)) { - return; - } - - if (event && activeEditor) { - this.refresh(); - } + // most of the time this is called when the user switches tabs or closes the file + // we already check for state inside the getprovider function, so we can just call refresh here + this.refresh(); }), vscode.commands.registerCommand('terraform.providers.openDocumentation', (module: ModuleProviderItem) => { if (module.docsLink) { @@ -75,27 +69,49 @@ export class ModuleProvidersDataProvider implements vscode.TreeDataProvider { const activeEditor = getActiveTextEditor(); + await vscode.commands.executeCommand('setContext', 'terraform.providers.documentOpened', true); + await vscode.commands.executeCommand('setContext', 'terraform.providers.documentIsTerraform', true); + await vscode.commands.executeCommand('setContext', 'terraform.providers.lspConnected', true); + await vscode.commands.executeCommand('setContext', 'terraform.providers.noResponse', false); + await vscode.commands.executeCommand('setContext', 'terraform.providers.noProviders', false); + if (activeEditor?.document === undefined) { + // there is no open document + await vscode.commands.executeCommand('setContext', 'terraform.providers.documentOpened', false); return []; } if (!isTerraformFile(activeEditor.document)) { + // the open file is not a terraform file + await vscode.commands.executeCommand('setContext', 'terraform.providers.documentIsTerraform', false); return []; } - const editor = activeEditor.document.uri; - const documentURI = Utils.dirname(editor); if (this.client === undefined) { + // connection to terraform-ls failed + await vscode.commands.executeCommand('setContext', 'terraform.providers.lspConnected', false); return []; } + const editor = activeEditor.document.uri; + const documentURI = Utils.dirname(editor); + + let response: terraform.ModuleProvidersResponse; try { - const response = await terraform.moduleProviders(documentURI.toString(), this.client, this.reporter); + response = await terraform.moduleProviders(documentURI.toString(), this.client, this.reporter); if (response === null) { + // no response from terraform-ls + await vscode.commands.executeCommand('setContext', 'terraform.providers.noResponse', true); return []; } + } catch { + // error from terraform-ls + await vscode.commands.executeCommand('setContext', 'terraform.providers.noResponse', true); + return []; + } - return Object.entries(response.provider_requirements).map( + try { + const list = Object.entries(response.provider_requirements).map( ([provider, details]) => new ModuleProviderItem( provider, @@ -105,7 +121,15 @@ export class ModuleProvidersDataProvider implements vscode.TreeDataProvider Date: Fri, 26 Jan 2024 08:28:06 -0500 Subject: [PATCH 2/6] Apply suggestions from code review Co-authored-by: Daniel Banck --- package.json | 2 +- src/providers/moduleCalls.ts | 2 +- src/providers/moduleProviders.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 695176d7d..4ee119dfc 100644 --- a/package.json +++ b/package.json @@ -762,7 +762,7 @@ }, { "view": "terraform.providers", - "contents": "There are no installed providers found for the current open file.\n[Learn more about providers](https://www.terraform.io/docs/language/modules/develop/index.html)", + "contents": "There are no installed providers found for the current open file.\n[Learn more about providers](https://www.terraform.io/docs/language/providers/index.html)", "when": "terraform.providers.noProviders === true" }, { diff --git a/src/providers/moduleCalls.ts b/src/providers/moduleCalls.ts index 9b67cd1e8..36a3d8701 100644 --- a/src/providers/moduleCalls.ts +++ b/src/providers/moduleCalls.ts @@ -75,7 +75,7 @@ export class ModuleCallsDataProvider implements vscode.TreeDataProvider { + vscode.window.onDidChangeActiveTextEditor(async () => { // most of the time this is called when the user switches tabs or closes the file // we already check for state inside the getModule function, so we can just call refresh here this.refresh(); diff --git a/src/providers/moduleProviders.ts b/src/providers/moduleProviders.ts index bc5339e88..ee6bb7d6c 100644 --- a/src/providers/moduleProviders.ts +++ b/src/providers/moduleProviders.ts @@ -37,7 +37,7 @@ export class ModuleProvidersDataProvider implements vscode.TreeDataProvider this.refresh()), - vscode.window.onDidChangeActiveTextEditor(async (event: vscode.TextEditor | undefined) => { + vscode.window.onDidChangeActiveTextEditor(async () => { // most of the time this is called when the user switches tabs or closes the file // we already check for state inside the getprovider function, so we can just call refresh here this.refresh(); From a38181c092e3229fbb23f8537be968cd873963f1 Mon Sep 17 00:00:00 2001 From: James Pogran Date: Tue, 6 Feb 2024 11:52:13 -0500 Subject: [PATCH 3/6] f --- package.json | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 4ee119dfc..22ad3ff81 100644 --- a/package.json +++ b/package.json @@ -750,45 +750,55 @@ ] }, "viewsWelcome": [ + { + "view": "terraform.providers", + "contents": "This view requires the language server to be enabled. Please enable it in your Settings:\n[Open Settings]()", + "when": "config.languageServer.enable === false" + }, { "view": "terraform.providers", "contents": "There are no open Terraform files. Please open a Terraform configuration file to see installed providers.", - "when": "terraform.providers.documentOpened === false" + "when": "config.languageServer.enable && terraform.providers.documentOpened === false" }, { "view": "terraform.providers", "contents": "The active document is not a Terraform file. Please open a Terraform configuration file to see installed providers.", - "when": "terraform.providers.documentIsTerraform === false" + "when": "config.languageServer.enable && terraform.providers.documentIsTerraform === false" }, { "view": "terraform.providers", "contents": "There are no installed providers found for the current open file.\n[Learn more about providers](https://www.terraform.io/docs/language/providers/index.html)", - "when": "terraform.providers.noProviders === true" + "when": "config.languageServer.enable && terraform.providers.noProviders === true" }, { "view": "terraform.providers", "contents": "The active editor cannot provide information about installed providers.\n[Learn more about providers](https://www.terraform.io/docs/language/providers/index.html)", - "when": "terraform.providers.noResponse === true" + "when": "config.languageServer.enable && terraform.providers.noResponse === true" + }, + { + "view": "terraform.modules", + "contents": "This view requires the language server to be enabled. Please enable it in your Settings:\n[Open Settings]()", + "when": "config.languageServer.enable === false" }, { "view": "terraform.modules", "contents": "There are no open Terraform files. Please open a Terraform configuration file to see installed modules.", - "when": "terraform.modules.documentOpened === false" + "when": "config.languageServer.enable && terraform.modules.documentOpened === false" }, { "view": "terraform.modules", "contents": "The active document is not a Terraform file. Please open a Terraform configuration file to see installed modules.", - "when": "terraform.modules.documentIsTerraform === false" + "when": "config.languageServer.enable && terraform.modules.documentIsTerraform === false" }, { "view": "terraform.modules", "contents": "There are no installed modules found for the current open file.\n[Learn more about modules](https://www.terraform.io/docs/language/modules/develop/index.html)", - "when": "terraform.modules.noModules === true" + "when": "config.languageServer.enable && terraform.modules.noModules === true" }, { "view": "terraform.modules", "contents": "The active editor cannot provide information about installed modules.\n[Learn more about modules](https://www.terraform.io/docs/language/modules/develop/index.html)", - "when": "terraform.modules.noResponse === true" + "when": "config.languageServer.enable && terraform.modules.noResponse === true" }, { "view": "terraform.cloud.workspaces", From 5a151275d5a32e1ca44bbf48165f0dd4e7bf926f Mon Sep 17 00:00:00 2001 From: James Pogran Date: Wed, 7 Feb 2024 12:01:24 -0500 Subject: [PATCH 4/6] open settings command --- package.json | 4 ++-- src/commands/terraformls.ts | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 22ad3ff81..ace1dcef9 100644 --- a/package.json +++ b/package.json @@ -752,7 +752,7 @@ "viewsWelcome": [ { "view": "terraform.providers", - "contents": "This view requires the language server to be enabled. Please enable it in your Settings:\n[Open Settings]()", + "contents": "This view requires the language server to be enabled:\n[Open Settings](command:terraform.openSettingsJson)", "when": "config.languageServer.enable === false" }, { @@ -777,7 +777,7 @@ }, { "view": "terraform.modules", - "contents": "This view requires the language server to be enabled. Please enable it in your Settings:\n[Open Settings]()", + "contents": "This view requires the language server to be enabled:\n[Open Settings](command:terraform.openSettingsJson)", "when": "config.languageServer.enable === false" }, { diff --git a/src/commands/terraformls.ts b/src/commands/terraformls.ts index da97d0fec..6eb61bdc2 100644 --- a/src/commands/terraformls.ts +++ b/src/commands/terraformls.ts @@ -38,6 +38,12 @@ export class TerraformLSCommands implements vscode.Disposable { await config('terraform').update('languageServer.enable', false, scope); }), + vscode.commands.registerCommand('terraform.openSettingsJson', async () => { + // this opens the default settings window (either UI or json) + await vscode.commands.executeCommand('workbench.action.openSettings', { + revealSetting: { key: 'terraform.languageServer.enable', edit: true }, + }); + }), ]; } From bdb70634ef343ddd3fc8c5cadde44703559e3eab Mon Sep 17 00:00:00 2001 From: James Pogran Date: Thu, 8 Feb 2024 11:05:35 -0500 Subject: [PATCH 5/6] fix --- package.json | 10 +++++----- src/commands/terraformls.ts | 14 +++++++++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index ace1dcef9..d5c0108d6 100644 --- a/package.json +++ b/package.json @@ -753,27 +753,27 @@ { "view": "terraform.providers", "contents": "This view requires the language server to be enabled:\n[Open Settings](command:terraform.openSettingsJson)", - "when": "config.languageServer.enable === false" + "when": "config.terraform.languageServer.enable === false" }, { "view": "terraform.providers", "contents": "There are no open Terraform files. Please open a Terraform configuration file to see installed providers.", - "when": "config.languageServer.enable && terraform.providers.documentOpened === false" + "when": "config.terraform.languageServer.enable && terraform.providers.documentOpened === false" }, { "view": "terraform.providers", "contents": "The active document is not a Terraform file. Please open a Terraform configuration file to see installed providers.", - "when": "config.languageServer.enable && terraform.providers.documentIsTerraform === false" + "when": "config.terraform.languageServer.enable && terraform.providers.documentIsTerraform === false" }, { "view": "terraform.providers", "contents": "There are no installed providers found for the current open file.\n[Learn more about providers](https://www.terraform.io/docs/language/providers/index.html)", - "when": "config.languageServer.enable && terraform.providers.noProviders === true" + "when": "config.terraform.languageServer.enable && terraform.providers.noProviders === true" }, { "view": "terraform.providers", "contents": "The active editor cannot provide information about installed providers.\n[Learn more about providers](https://www.terraform.io/docs/language/providers/index.html)", - "when": "config.languageServer.enable && terraform.providers.noResponse === true" + "when": "config.terraform.languageServer.enable && terraform.providers.noResponse === true" }, { "view": "terraform.modules", diff --git a/src/commands/terraformls.ts b/src/commands/terraformls.ts index 6eb61bdc2..3aa33c7ec 100644 --- a/src/commands/terraformls.ts +++ b/src/commands/terraformls.ts @@ -40,9 +40,17 @@ export class TerraformLSCommands implements vscode.Disposable { }), vscode.commands.registerCommand('terraform.openSettingsJson', async () => { // this opens the default settings window (either UI or json) - await vscode.commands.executeCommand('workbench.action.openSettings', { - revealSetting: { key: 'terraform.languageServer.enable', edit: true }, - }); + const s = await vscode.workspace.getConfiguration('workbench').get('settings.editor'); + if (s === 'json') { + return await vscode.commands.executeCommand('workbench.action.openSettingsJson', { + revealSetting: { key: 'terraform.languageServer.enable', edit: true }, + }); + } else { + return await vscode.commands.executeCommand('workbench.action.openSettings', { + focusSearch: true, + query: '@ext:hashicorp.terraform', + }); + } }), ]; } From d15579fcac5c0f0e47cebc093ef126e6552d26d5 Mon Sep 17 00:00:00 2001 From: James Pogran Date: Thu, 8 Feb 2024 11:13:12 -0500 Subject: [PATCH 6/6] finish fixing the global search replace --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d5c0108d6..007930ffe 100644 --- a/package.json +++ b/package.json @@ -778,27 +778,27 @@ { "view": "terraform.modules", "contents": "This view requires the language server to be enabled:\n[Open Settings](command:terraform.openSettingsJson)", - "when": "config.languageServer.enable === false" + "when": "config.terraform.languageServer.enable === false" }, { "view": "terraform.modules", "contents": "There are no open Terraform files. Please open a Terraform configuration file to see installed modules.", - "when": "config.languageServer.enable && terraform.modules.documentOpened === false" + "when": "config.terraform.languageServer.enable && terraform.modules.documentOpened === false" }, { "view": "terraform.modules", "contents": "The active document is not a Terraform file. Please open a Terraform configuration file to see installed modules.", - "when": "config.languageServer.enable && terraform.modules.documentIsTerraform === false" + "when": "config.terraform.languageServer.enable && terraform.modules.documentIsTerraform === false" }, { "view": "terraform.modules", "contents": "There are no installed modules found for the current open file.\n[Learn more about modules](https://www.terraform.io/docs/language/modules/develop/index.html)", - "when": "config.languageServer.enable && terraform.modules.noModules === true" + "when": "config.terraform.languageServer.enable && terraform.modules.noModules === true" }, { "view": "terraform.modules", "contents": "The active editor cannot provide information about installed modules.\n[Learn more about modules](https://www.terraform.io/docs/language/modules/develop/index.html)", - "when": "config.languageServer.enable && terraform.modules.noResponse === true" + "when": "config.terraform.languageServer.enable && terraform.modules.noResponse === true" }, { "view": "terraform.cloud.workspaces",