Skip to content

Commit 76692ab

Browse files
authored
fix: Prevent multiple calls of reveal() at the same time (#401)
1 parent c272be7 commit 76692ab

File tree

2 files changed

+23
-11
lines changed

2 files changed

+23
-11
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"activationEvents": [
2424
"onCommand:java.project.create",
2525
"onCommand:_java.project.open",
26+
"onCommand:java.view.package.revealInProjectExplorer",
2627
"onView:javaProjectExplorer"
2728
],
2829
"license": "MIT",

src/views/dependencyExplorer.ts

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT license.
33

44
import * as fse from "fs-extra";
5+
import * as _ from "lodash";
56
import * as path from "path";
67
import { commands, Disposable, ExtensionContext, TextEditor, TreeView, TreeViewVisibilityChangeEvent, Uri, window } from "vscode";
78
import { instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper";
@@ -14,6 +15,7 @@ import { Jdtls } from "../java/jdtls";
1415
import { INodeData } from "../java/nodeData";
1516
import { languageServerApiManager } from "../languageServerApi/languageServerApiManager";
1617
import { Settings } from "../settings";
18+
import { Lock } from "../utils/Lock";
1719
import { DataNode } from "./dataNode";
1820
import { DependencyDataProvider } from "./dependencyDataProvider";
1921
import { ExplorerNode } from "./explorerNode";
@@ -30,6 +32,8 @@ export class DependencyExplorer implements Disposable {
3032

3133
private static _instance: DependencyExplorer;
3234

35+
private _lock: Lock = new Lock();
36+
3337
private _dependencyViewer: TreeView<ExplorerNode>;
3438

3539
private _dataProvider: DependencyDataProvider;
@@ -133,21 +137,28 @@ export class DependencyExplorer implements Disposable {
133137
}
134138

135139
public async reveal(uri: Uri): Promise<void> {
136-
if (!await languageServerApiManager.isStandardServerReady()) {
137-
return;
138-
}
140+
try {
141+
await this._lock.acquire();
139142

140-
let node: DataNode | undefined = explorerNodeCache.getDataNode(uri);
141-
if (!node) {
142-
const paths: INodeData[] = await Jdtls.resolvePath(uri.toString());
143-
if (!paths || paths.length === 0) {
143+
if (!await languageServerApiManager.isStandardServerReady()) {
144+
return;
145+
}
146+
147+
let node: DataNode | undefined = explorerNodeCache.getDataNode(uri);
148+
if (!node) {
149+
const paths: INodeData[] = await Jdtls.resolvePath(uri.toString());
150+
if (!_.isEmpty(paths)) {
151+
node = await this._dataProvider.revealPaths(paths);
152+
}
153+
}
154+
155+
if (!node) {
144156
return;
145157
}
146-
node = await this._dataProvider.revealPaths(paths);
147-
}
148158

149-
if (this._dependencyViewer.visible) {
150-
this._dependencyViewer.reveal(node);
159+
await this._dependencyViewer.reveal(node);
160+
} finally {
161+
this._lock.release();
151162
}
152163
}
153164

0 commit comments

Comments
 (0)