Skip to content

Commit 1ec3090

Browse files
committed
Better status bar usage and docs update
1 parent 27c6e85 commit 1ec3090

File tree

4 files changed

+55
-81
lines changed

4 files changed

+55
-81
lines changed

README.md

-12
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@
22

33
<a href="https://marketplace.visualstudio.com/items?itemName=richardwillis.vscode-gradle">![Marketplace extension](https://img.shields.io/visual-studio-marketplace/i/richardwillis.vscode-gradle)</a>
44

5-
<!-- <a href="https://github.com/badsyntax/vscode-gradle/actions?workflow=Node+CI+Test"><img src="https://github.com/badsyntax/vscode-gradle/workflows/Node%20CI%20Test/badge.svg" /></a> -->
6-
7-
<!-- ![Build status](https://github.com/badsyntax/vscode-gradle/workflows/Node%20CI/badge.svg) -->
8-
95
Run gradle tasks in VS Code.
106

117
![Screencat](images/screencast.gif)
@@ -26,14 +22,6 @@ Run gradle tasks in VS Code.
2622
"gradle.enableTasksExplorer": true // Enable an explorer view for gradle tasks
2723
```
2824

29-
## Troubleshooting
30-
31-
<details><summary>The extension hangs with "Refreshing gradle tasks"...</summary>
32-
33-
Eventually the command should fail with an error message. This is usually due to gradle not being able to resolve dependencies. Check your network connection.
34-
35-
</details>
36-
3725
## Credits
3826

3927
Originally forked from [Cazzar/vscode-gradle](https://github.com/Cazzar/vscode-gradle).

TODO.md

-11
This file was deleted.

src/extension.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import {
44
commands,
55
ExtensionContext,
66
Disposable,
7-
TaskProvider
7+
TaskProvider,
8+
StatusBarAlignment
89
} from 'vscode';
910
import { GradleTasksTreeDataProvider } from './gradleView';
1011
import {
@@ -37,7 +38,13 @@ function registerTaskProvider(
3738
);
3839
context.subscriptions.push(workspaceWatcher);
3940

40-
const provider: TaskProvider = new GradleTaskProvider();
41+
const statusBarItem = window.createStatusBarItem(
42+
StatusBarAlignment.Left,
43+
1
44+
);
45+
context.subscriptions.push(statusBarItem);
46+
47+
const provider: TaskProvider = new GradleTaskProvider(statusBarItem);
4148
const disposable = workspace.registerTaskProvider('gradle', provider);
4249
context.subscriptions.push(disposable);
4350
return disposable;

src/tasks.ts

+46-56
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import {
1010
TaskProvider,
1111
TaskScope,
1212
QuickPickItem,
13-
Disposable,
14-
ProgressLocation
13+
ProgressLocation,
14+
StatusBarItem
1515
} from 'vscode';
1616
import * as path from 'path';
1717
import * as fs from 'fs';
@@ -37,11 +37,11 @@ type AutoDetect = 'on' | 'off';
3737
let cachedTasks: Task[] | undefined = undefined;
3838

3939
export class GradleTaskProvider implements TaskProvider {
40-
constructor() {}
40+
constructor(readonly statusBarItem: StatusBarItem) {}
4141

4242
async provideTasks() {
4343
try {
44-
return await provideGradleTasks();
44+
return await provideGradleTasks(this.statusBarItem);
4545
} catch (e) {
4646
window.showErrorMessage(`Unable to get gradle tasks - ${e.message}`);
4747
}
@@ -50,7 +50,7 @@ export class GradleTaskProvider implements TaskProvider {
5050
public async resolveTask(_task: Task): Promise<Task | undefined> {
5151
const gradleTask = (<any>_task.definition).task;
5252
if (gradleTask) {
53-
const kind: GradleTaskDefinition = <any>_task.definition;
53+
const { definition } = <any>_task;
5454
let buildGradleUri: Uri;
5555
if (
5656
_task.scope === undefined ||
@@ -60,9 +60,9 @@ export class GradleTaskProvider implements TaskProvider {
6060
// scope is required to be a WorkspaceFolder for resolveTask
6161
return undefined;
6262
}
63-
if (kind.path) {
63+
if (definition.path) {
6464
buildGradleUri = _task.scope.uri.with({
65-
path: _task.scope.uri.path + '/' + kind.path + 'build.gradle'
65+
path: _task.scope.uri.path + '/' + definition.path + 'build.gradle'
6666
});
6767
} else {
6868
buildGradleUri = _task.scope.uri.with({
@@ -72,8 +72,8 @@ export class GradleTaskProvider implements TaskProvider {
7272
const folder = workspace.getWorkspaceFolder(buildGradleUri);
7373
if (folder) {
7474
return createTask(
75-
kind,
76-
kind.task,
75+
definition,
76+
definition.task,
7777
_task.scope,
7878
buildGradleUri,
7979
await getGradleWrapperCommandFromFolder(folder)
@@ -112,7 +112,9 @@ async function getGradleWrapperCommandFromFolder(
112112
}
113113
}
114114

115-
async function detectGradleTasks(): Promise<Task[]> {
115+
async function detectGradleTasks(
116+
statusBarItem: StatusBarItem
117+
): Promise<Task[]> {
116118
const emptyTasks: Task[] = [];
117119
const allTasks: Task[] = [];
118120
const visitedBuildGradleFiles: Set<string> = new Set();
@@ -128,7 +130,10 @@ async function detectGradleTasks(): Promise<Task[]> {
128130
const paths = await workspace.findFiles(relativePattern);
129131
for (const path of paths) {
130132
if (!visitedBuildGradleFiles.has(path.fsPath)) {
131-
const tasks = await provideGradleTasksForFolder(path);
133+
const tasks = await provideGradleTasksForFolder(
134+
path,
135+
statusBarItem
136+
);
132137
visitedBuildGradleFiles.add(path.fsPath);
133138
allTasks.push(...tasks);
134139
}
@@ -142,17 +147,20 @@ async function detectGradleTasks(): Promise<Task[]> {
142147
}
143148

144149
export async function detectGradleTasksForFolder(
145-
folder: Uri
150+
folder: Uri,
151+
statusBarItem: StatusBarItem
146152
): Promise<FolderTaskItem[]> {
147153
const folderTasks: FolderTaskItem[] = [];
148-
const tasks = await provideGradleTasksForFolder(folder);
149-
folderTasks.push(...tasks.map(t => ({ label: t.name, task: t })));
154+
const tasks = await provideGradleTasksForFolder(folder, statusBarItem);
155+
folderTasks.push(...tasks.map(task => ({ label: task.name, task })));
150156
return folderTasks;
151157
}
152158

153-
export async function provideGradleTasks(): Promise<Task[]> {
159+
export async function provideGradleTasks(
160+
statusBarItem: StatusBarItem
161+
): Promise<Task[]> {
154162
if (!cachedTasks) {
155-
cachedTasks = await detectGradleTasks();
163+
cachedTasks = await detectGradleTasks(statusBarItem);
156164
}
157165
return cachedTasks;
158166
}
@@ -166,7 +174,8 @@ function isAutoDetectionEnabled(folder: WorkspaceFolder): boolean {
166174
}
167175

168176
async function provideGradleTasksForFolder(
169-
gradleBuildFileUri: Uri
177+
gradleBuildFileUri: Uri,
178+
statusBarItem: StatusBarItem
170179
): Promise<Task[]> {
171180
const emptyTasks: Task[] = [];
172181

@@ -178,22 +187,13 @@ async function provideGradleTasksForFolder(
178187
if (!command) {
179188
return emptyTasks;
180189
}
181-
const tasksMap = await getTasks(command, folder);
190+
const tasksMap = await getTasks(command, folder, statusBarItem);
182191
if (!tasksMap) {
183192
return emptyTasks;
184193
}
185194
return Object.keys(tasksMap)
186195
.sort((a, b) => a.localeCompare(b))
187-
.map(task =>
188-
createTask(
189-
task,
190-
task,
191-
folder!,
192-
gradleBuildFileUri,
193-
command,
194-
tasksMap![task]
195-
)
196-
);
196+
.map(task => createTask(task, task, folder!, gradleBuildFileUri, command));
197197
}
198198

199199
export function getTaskName(task: string, relativePath: string | undefined) {
@@ -208,14 +208,13 @@ export function createTask(
208208
taskName: string,
209209
folder: WorkspaceFolder,
210210
buildGradleUri: Uri,
211-
command: string,
212-
description?: string
211+
command: string
213212
): Task {
214-
let kind: GradleTaskDefinition;
213+
let definition: GradleTaskDefinition;
215214
if (typeof taskDefinition === 'string') {
216-
kind = { type: 'gradle', task: taskDefinition };
215+
definition = { type: 'gradle', task: taskDefinition };
217216
} else {
218-
kind = taskDefinition;
217+
definition = taskDefinition;
219218
}
220219

221220
function getCommandLine(task: string): string {
@@ -236,12 +235,12 @@ export function createTask(
236235

237236
const relativeBuildGradle = getRelativePath(folder, buildGradleUri);
238237
if (relativeBuildGradle.length) {
239-
kind.path = getRelativePath(folder, buildGradleUri);
238+
definition.path = getRelativePath(folder, buildGradleUri);
240239
}
241-
const normalizedTaskName = getTaskName(kind.task, relativeBuildGradle);
240+
const normalizedTaskName = getTaskName(definition.task, relativeBuildGradle);
242241
const cwd = path.dirname(buildGradleUri.fsPath);
243242
const task = new Task(
244-
kind,
243+
definition,
245244
folder,
246245
normalizedTaskName,
247246
'gradle',
@@ -328,11 +327,12 @@ function exec(
328327

329328
function getTasksFromGradle(
330329
command: string,
331-
folder: WorkspaceFolder
330+
folder: WorkspaceFolder,
331+
statusBarItem: StatusBarItem
332332
): Promise<ProcessOutput> {
333-
const statusbar: Disposable = window.setStatusBarMessage(
334-
'Refreshing gradle tasks'
335-
);
333+
statusBarItem.text = '$(sync~spin) Refreshing gradle tasks';
334+
statusBarItem.show();
335+
336336
const args = ['--console', 'plain', 'tasks'];
337337
const tasksArgs = getTasksArgs();
338338
if (tasksArgs) {
@@ -349,39 +349,29 @@ function getTasksFromGradle(
349349
title: 'Loading Gradle Tasks',
350350
cancellable: true
351351
},
352-
(progress, token) => {
352+
(_, token) => {
353353
token.onCancellationRequested(() => {
354354
process.kill();
355355
window.showInformationMessage(
356356
'Operation cancelled. Try again using command "Gradle: Refresh Tasks"'
357357
);
358358
});
359-
360-
progress.report({ increment: 20 });
361-
362-
const int = setInterval(
363-
() =>
364-
progress.report({
365-
increment: 10
366-
}),
367-
1500
368-
);
369-
370-
return promise.finally(() => clearInterval(int));
359+
return promise;
371360
}
372361
);
373362
}, 3000);
374363

375364
return promise.finally(() => {
376365
clearTimeout(showProgress);
377-
statusbar.dispose();
366+
statusBarItem.hide();
378367
});
379368
}
380369

381370
async function getTasks(
382371
command: string,
383-
folder: WorkspaceFolder
372+
folder: WorkspaceFolder,
373+
statusBarItem: StatusBarItem
384374
): Promise<StringMap | undefined> {
385-
const { stdout } = await getTasksFromGradle(command, folder);
375+
const { stdout } = await getTasksFromGradle(command, folder, statusBarItem);
386376
return parseGradleTasks(stdout);
387377
}

0 commit comments

Comments
 (0)