Skip to content

Commit 8d44e02

Browse files
authored
Improve API and export types (#758)
* Improve API and export types * Simplify API Waiting for the tasks to be loaded before running a task is unnecessary
1 parent d4c5f9e commit 8d44e02

File tree

3 files changed

+58
-41
lines changed

3 files changed

+58
-41
lines changed

extension/src/api/Api.ts

+46-39
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@ import * as vscode from 'vscode';
22
import { Output } from '../proto/gradle_pb';
33
import { Logger, logger } from '../logger';
44
import { GradleTasksTreeDataProvider } from '../views';
5-
import { GradleTaskDefinition } from '../tasks';
65
import { GradleClient } from '../client';
76
import { Icons } from '../icons';
8-
import {
9-
getRunBuildCancellationKey,
10-
getRunTaskCommandCancellationKey,
11-
} from '../client/CancellationKeys';
7+
import { getRunBuildCancellationKey } from '../client/CancellationKeys';
128

139
export interface RunTaskOpts {
1410
projectFolder: string;
@@ -17,6 +13,7 @@ export interface RunTaskOpts {
1713
input?: string;
1814
onOutput?: (output: Output) => void;
1915
showOutputColors: boolean;
16+
cancellationKey?: string;
2017
}
2118

2219
export interface RunBuildOpts {
@@ -25,11 +22,19 @@ export interface RunBuildOpts {
2522
input?: string;
2623
onOutput?: (output: Output) => void;
2724
showOutputColors: boolean;
25+
cancellationKey?: string;
2826
}
2927

3028
export interface CancelTaskOpts {
31-
projectFolder: string;
32-
taskName: string;
29+
projectFolder?: string;
30+
taskName?: string;
31+
cancellationKey?: string;
32+
}
33+
34+
export interface CancelBuildOpts {
35+
projectFolder?: string;
36+
args?: ReadonlyArray<string>;
37+
cancellationKey?: string;
3338
}
3439

3540
export class Api {
@@ -39,61 +44,63 @@ export class Api {
3944
private readonly icons: Icons
4045
) {}
4146

42-
public async runTask(opts: RunTaskOpts): Promise<void> {
47+
public onReady(callback: () => void): vscode.Disposable {
48+
return this.client.onDidConnect(callback);
49+
}
50+
51+
public runTask(opts: RunTaskOpts): Promise<void> {
4352
const taskArgs = (opts.args || []).filter(Boolean);
44-
const task = await this.findTask(opts.projectFolder, opts.taskName);
4553
const runBuildArgs = [opts.taskName].concat(taskArgs);
4654
const runBuildOpts = {
4755
...opts,
4856
args: runBuildArgs,
4957
};
50-
return this.runBuild(runBuildOpts, task);
58+
return this.runBuild(runBuildOpts);
5159
}
5260

53-
public async runBuild(opts: RunBuildOpts, task?: vscode.Task): Promise<void> {
54-
const cancellationKey = getRunBuildCancellationKey(
55-
opts.projectFolder,
56-
opts.args
57-
);
61+
public runBuild(opts: RunBuildOpts): Promise<void> {
5862
return this.client.runBuild(
5963
opts.projectFolder,
60-
cancellationKey,
64+
opts.cancellationKey ||
65+
getRunBuildCancellationKey(opts.projectFolder, opts.args),
6166
opts.args,
6267
opts.input,
6368
0,
64-
task,
69+
undefined,
6570
opts.onOutput,
6671
opts.showOutputColors
6772
);
6873
}
6974

70-
public async cancelRunTask(opts: CancelTaskOpts): Promise<void> {
71-
const task = await this.findTask(opts.projectFolder, opts.taskName);
72-
const cancellationKey = getRunTaskCommandCancellationKey(
73-
opts.projectFolder,
74-
opts.taskName
75-
);
76-
return this.client.cancelBuild(cancellationKey, task);
75+
public cancelRunTask(opts: CancelTaskOpts): Promise<void> {
76+
const args = opts.taskName ? [opts.taskName] : [];
77+
const cancelBuildOpts = {
78+
projectFolder: opts.projectFolder,
79+
args,
80+
cancellationKey: opts.cancellationKey,
81+
};
82+
return this.cancelRunBuild(cancelBuildOpts);
83+
}
84+
85+
public cancelRunBuild(opts: CancelBuildOpts): Promise<void> {
86+
const cancellationKey = this.getRunBuildCancellationKey(opts);
87+
return this.client.cancelBuild(cancellationKey);
88+
}
89+
90+
public cancelAllBuilds(): Promise<void> {
91+
return this.client.cancelBuilds();
7792
}
7893

79-
private async findTask(
80-
projectFolder: string,
81-
taskName: string
82-
): Promise<vscode.Task> {
83-
const tasks = await vscode.tasks.fetchTasks({ type: 'gradle' });
84-
if (!tasks) {
85-
throw new Error('Unable to load gradle tasks');
94+
private getRunBuildCancellationKey(opts: CancelBuildOpts): string {
95+
if (opts.cancellationKey) {
96+
return opts.cancellationKey;
8697
}
87-
const foundTask = tasks.find((task) => {
88-
const definition = task.definition as GradleTaskDefinition;
89-
return (
90-
task.name === taskName && definition.projectFolder === projectFolder
98+
if (!opts.args || !opts.projectFolder) {
99+
throw new Error(
100+
'args and projectFolder are required to build the cancellation key'
91101
);
92-
});
93-
if (!foundTask) {
94-
throw new Error(`Unable to find task: ${taskName}`);
95102
}
96-
return foundTask;
103+
return getRunBuildCancellationKey(opts.projectFolder, opts.args);
97104
}
98105

99106
public getTasksTreeProvider(): GradleTasksTreeDataProvider {

extension/src/client/GradleClient.ts

+1
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ export class GradleClient implements vscode.Disposable {
354354
);
355355
});
356356
logger.info('Cancel build:', reply.getMessage());
357+
357358
if (!reply.getBuildRunning() && task) {
358359
removeCancellingTask(task);
359360
}

npm-package/index.ts

+11-2
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,22 @@ import {
33
RunBuildRequest,
44
CancelBuildRequest,
55
} from './lib/proto/gradle_pb';
6-
import type { Api, RunTaskOpts, CancelTaskOpts } from './lib/api/Api';
6+
7+
import type {
8+
Api,
9+
RunTaskOpts,
10+
CancelTaskOpts,
11+
CancelBuildOpts,
12+
RunBuildOpts,
13+
} from './lib/api/Api';
714

815
export {
916
Output,
1017
RunBuildRequest,
18+
RunBuildOpts,
1119
RunTaskOpts,
12-
CancelTaskOpts,
1320
CancelBuildRequest,
21+
CancelBuildOpts,
22+
CancelTaskOpts,
1423
Api as ExtensionApi,
1524
};

0 commit comments

Comments
 (0)