From a55f551dfac19406dbf793f56fb47dba5bd7c48b Mon Sep 17 00:00:00 2001 From: aboyko Date: Fri, 19 Jan 2024 18:50:15 -0500 Subject: [PATCH] [vscode-spring-cli] Simple TaskProvider implementation --- .../vscode-spring-cli/package.json | 4 +++ .../vscode-spring-cli/src/cli.ts | 26 +++++++++++++++-- .../vscode-spring-cli/src/extension.ts | 29 +++++++++++++------ 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/vscode-extensions/vscode-spring-cli/package.json b/vscode-extensions/vscode-spring-cli/package.json index c0bbce68d..513dd22f1 100644 --- a/vscode-extensions/vscode-spring-cli/package.json +++ b/vscode-extensions/vscode-spring-cli/package.json @@ -104,6 +104,10 @@ "arguments": { "type": "array", "description": "The parameters of the command" + }, + "cwd": { + "type": "string", + "description": "Path for Spring CLI process execution" } } } diff --git a/vscode-extensions/vscode-spring-cli/src/cli.ts b/vscode-extensions/vscode-spring-cli/src/cli.ts index dfb373961..50b7ee2a5 100644 --- a/vscode-extensions/vscode-spring-cli/src/cli.ts +++ b/vscode-extensions/vscode-spring-cli/src/cli.ts @@ -1,14 +1,14 @@ import { BootAddMetadata, BootNewMetadata, Project, ProjectCatalog, commandAddMetadata } from "./cli-types"; -import { ProcessExecution, ProgressLocation, Task, TaskScope, Uri, env, tasks, window, workspace } from "vscode"; +import { CancellationToken, ProcessExecution, ProgressLocation, ProviderResult, Task, TaskProvider, TaskScope, Uri, tasks, window, workspace } from "vscode"; import cp from "child_process"; import { homedir } from "os"; import { getWorkspaceRoot } from "./utils"; -const SPRING_CLI_TASK_TYPE = 'spring-cli'; +export const SPRING_CLI_TASK_TYPE = 'spring-cli'; export class Cli { - private get executable(): string { + get executable(): string { return workspace.getConfiguration("spring-cli").get("executable") || "spring"; } @@ -203,3 +203,23 @@ export class Cli { } +export class CliTaskProvider implements TaskProvider { + + constructor(private cli: Cli) {} + + provideTasks(token: CancellationToken): ProviderResult { + return []; + } + + resolveTask(task: Task, token: CancellationToken): ProviderResult { + if (task.definition.type === SPRING_CLI_TASK_TYPE) { + const processOpts = { cwd: task.definition.cwd || getWorkspaceRoot()?.fsPath || homedir() }; + task.execution = this.cli.executable.endsWith(".jar") ? + new ProcessExecution("java", [ "-jar", this.cli.executable, ...(task.definition.args || [])], processOpts) + : new ProcessExecution(this.cli.executable, task.definition.args || [], processOpts); + } + return task; + } + +} + diff --git a/vscode-extensions/vscode-spring-cli/src/extension.ts b/vscode-extensions/vscode-spring-cli/src/extension.ts index c195d1125..9bb8182a2 100644 --- a/vscode-extensions/vscode-spring-cli/src/extension.ts +++ b/vscode-extensions/vscode-spring-cli/src/extension.ts @@ -1,22 +1,33 @@ "use strict"; -import * as vscode from "vscode"; -import { Cli } from "./cli"; +import { Cli, CliTaskProvider, SPRING_CLI_TASK_TYPE } from "./cli"; import { handleBootAdd, handleBootNew } from "./boot"; import { handleCatalogAdd, handleCatalogRemove } from "./project-catalog"; import { handleProjectAdd, handleProjectRemove } from "./project"; +import { handleCommandAdd, handleCommandNew, handleCommandRemove } from "./command"; +import { ExtensionContext, commands, tasks } from "vscode"; export const CLI = new Cli(); -export async function activate(context: vscode.ExtensionContext): Promise { +export async function activate(context: ExtensionContext): Promise { - vscode.commands.registerCommand('vscode-spring-cli.boot.new', handleBootNew); - vscode.commands.registerCommand('vscode-spring-cli.boot.add', handleBootAdd); + context.subscriptions.push(...[ + + ]); + context.subscriptions.push(commands.registerCommand('vscode-spring-cli.boot.new', handleBootNew)); + context.subscriptions.push(commands.registerCommand('vscode-spring-cli.boot.add', handleBootAdd)); - vscode.commands.registerCommand('vscode-spring-cli.project-catalog.add', handleCatalogAdd); - vscode.commands.registerCommand('vscode-spring-cli.project-catalog.remove', handleCatalogRemove); + context.subscriptions.push(commands.registerCommand('vscode-spring-cli.project-catalog.add', handleCatalogAdd)); + context.subscriptions.push(commands.registerCommand('vscode-spring-cli.project-catalog.remove', handleCatalogRemove)); + + context.subscriptions.push(commands.registerCommand('vscode-spring-cli.project.add', handleProjectAdd)); + context.subscriptions.push(commands.registerCommand('vscode-spring-cli.project.remove', handleProjectRemove)); + + context.subscriptions.push(commands.registerCommand('vscode-spring-cli.command.add', handleCommandAdd)); + context.subscriptions.push(commands.registerCommand('vscode-spring-cli.command.remove', handleCommandRemove)); + context.subscriptions.push(commands.registerCommand('vscode-spring-cli.command.new', handleCommandNew)); + + context.subscriptions.push(tasks.registerTaskProvider(SPRING_CLI_TASK_TYPE, new CliTaskProvider(CLI))); - vscode.commands.registerCommand('vscode-spring-cli.project.add', handleProjectAdd); - vscode.commands.registerCommand('vscode-spring-cli.project.remove', handleProjectRemove); } export async function deactivate(): Promise {