Skip to content

Commit 341ac5b

Browse files
authored
bugfix: Data tree node not found (#484)
1 parent 9fc5bf3 commit 341ac5b

File tree

9 files changed

+59
-83
lines changed

9 files changed

+59
-83
lines changed

package-lock.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,7 @@
602602
"webpack-cli": "^3.3.12"
603603
},
604604
"dependencies": {
605+
"await-lock": "^2.1.0",
605606
"fs-extra": "^7.0.1",
606607
"globby": "11.0.1",
607608
"lodash": "^4.17.21",

src/languageServerApi/languageServerApiManager.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,13 @@ class LanguageServerApiManager {
2828
return this.serverMode === LanguageServerMode.LightWeight;
2929
}
3030

31-
public async isSwitchingServer(): Promise<boolean> {
31+
public async awaitSwitchingServerFinished(): Promise<void> {
3232
await this.checkServerMode();
33-
return this.serverMode === LanguageServerMode.Hybrid;
33+
if (this.serverMode === LanguageServerMode.Hybrid) {
34+
await new Promise<void>((resolve: () => void): void => {
35+
extensions.getExtension("redhat.java")!.exports.onDidServerModeChange(resolve);
36+
});
37+
}
3438
}
3539

3640
private async checkServerMode(): Promise<void> {
@@ -63,8 +67,17 @@ class LanguageServerApiManager {
6367
if (extensionApi.onDidServerModeChange) {
6468
const onDidServerModeChange: Event<string> = extensionApi.onDidServerModeChange;
6569
contextManager.context.subscriptions.push(onDidServerModeChange(async (mode: LanguageServerMode) => {
66-
this.serverMode = mode;
67-
commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false);
70+
if (this.serverMode !== mode) {
71+
let needRefresh: boolean = true;
72+
if (this.serverMode === "Hybrid") {
73+
// Explorer will await when JLS is in Hybrid mode (activating),
74+
needRefresh = false;
75+
}
76+
this.serverMode = mode;
77+
if (needRefresh) {
78+
commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false);
79+
}
80+
}
6881
}));
6982
}
7083

src/utility.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ export class Utility {
3030
if (uri.scheme === "file" && !workspace.getWorkspaceFolder(uri)) {
3131
return false;
3232
}
33+
34+
await languageServerApiManager.awaitSwitchingServerFinished();
3335
if (!await languageServerApiManager.isStandardServerReady()) {
3436
return false;
3537
}

src/utils/Lock.ts

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,6 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4-
import { EventEmitter } from "events";
4+
import AwaitLock from "await-lock";
55

6-
export class Lock {
7-
private _locked: boolean;
8-
private _eventEmitter: EventEmitter;
9-
10-
constructor() {
11-
this._locked = false;
12-
this._eventEmitter = new EventEmitter();
13-
}
14-
15-
public async acquire(): Promise<void> {
16-
return new Promise((resolve) => {
17-
if (!this._locked) {
18-
this._locked = true;
19-
return resolve();
20-
}
21-
22-
const tryAcquire = () => {
23-
if (!this._locked) {
24-
this._locked = true;
25-
this._eventEmitter.removeListener("release", tryAcquire);
26-
return resolve();
27-
}
28-
};
29-
this._eventEmitter.on("release", tryAcquire);
30-
});
31-
}
32-
33-
public release(): void {
34-
this._locked = false;
35-
setImmediate(() => this._eventEmitter.emit("release"));
36-
}
37-
}
6+
export const explorerLock: AwaitLock = new AwaitLock();

src/views/dataNode.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@
44
import * as _ from "lodash";
55
import { ThemeIcon, TreeItem, TreeItemCollapsibleState, Uri } from "vscode";
66
import { INodeData, NodeKind } from "../java/nodeData";
7-
import { Lock } from "../utils/Lock";
7+
import { explorerLock } from "../utils/Lock";
88
import { ExplorerNode } from "./explorerNode";
99

1010
export abstract class DataNode extends ExplorerNode {
1111

1212
protected _childrenNodes: ExplorerNode[];
1313

14-
protected _lock: Lock = new Lock();
15-
1614
constructor(protected _nodeData: INodeData, parent?: DataNode) {
1715
super(parent);
1816
}
@@ -74,7 +72,7 @@ export abstract class DataNode extends ExplorerNode {
7472

7573
public async getChildren(): Promise<ExplorerNode[]> {
7674
try {
77-
await this._lock.acquire();
75+
await explorerLock.acquireAsync();
7876
if (!this._nodeData.children) {
7977
const data = await this.loadData();
8078
this._nodeData.children = data;
@@ -83,7 +81,7 @@ export abstract class DataNode extends ExplorerNode {
8381
}
8482
return this._childrenNodes;
8583
} finally {
86-
this._lock.release();
84+
explorerLock.release();
8785
}
8886
}
8987

src/views/dependencyDataProvider.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import * as _ from "lodash";
55
import {
6-
commands, Event, EventEmitter, ExtensionContext, extensions, ProviderResult,
6+
commands, Event, EventEmitter, ExtensionContext, ProviderResult,
77
RelativePattern, TreeDataProvider, TreeItem, Uri, window, workspace,
88
} from "vscode";
99
import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper";
@@ -15,7 +15,7 @@ import { Jdtls } from "../java/jdtls";
1515
import { INodeData, NodeKind } from "../java/nodeData";
1616
import { languageServerApiManager } from "../languageServerApi/languageServerApiManager";
1717
import { Settings } from "../settings";
18-
import { Lock } from "../utils/Lock";
18+
import { explorerLock } from "../utils/Lock";
1919
import { DataNode } from "./dataNode";
2020
import { ExplorerNode } from "./explorerNode";
2121
import { explorerNodeCache } from "./nodeCache/explorerNodeCache";
@@ -26,8 +26,6 @@ export class DependencyDataProvider implements TreeDataProvider<ExplorerNode> {
2626

2727
private _onDidChangeTreeData: EventEmitter<ExplorerNode | null | undefined> = new EventEmitter<ExplorerNode | null | undefined>();
2828

29-
private _lock: Lock = new Lock();
30-
3129
// tslint:disable-next-line:member-ordering
3230
public onDidChangeTreeData: Event<ExplorerNode | null | undefined> = this._onDidChangeTreeData.event;
3331

@@ -100,11 +98,7 @@ export class DependencyDataProvider implements TreeDataProvider<ExplorerNode> {
10098
return [];
10199
}
102100

103-
if (await languageServerApiManager.isSwitchingServer()) {
104-
await new Promise<void>((resolve: () => void): void => {
105-
extensions.getExtension("redhat.java")!.exports.onDidServerModeChange(resolve);
106-
});
107-
}
101+
await languageServerApiManager.awaitSwitchingServerFinished();
108102

109103
const children = (!this._rootItems || !element) ?
110104
await this.getRootNodes() : await element.getChildren();
@@ -151,7 +145,7 @@ export class DependencyDataProvider implements TreeDataProvider<ExplorerNode> {
151145

152146
private async getRootNodes(): Promise<ExplorerNode[]> {
153147
try {
154-
await this._lock.acquire();
148+
await explorerLock.acquireAsync();
155149

156150
if (this._rootItems) {
157151
return this._rootItems;
@@ -178,7 +172,7 @@ export class DependencyDataProvider implements TreeDataProvider<ExplorerNode> {
178172
contextManager.setContextValue(Context.NO_JAVA_PEOJECT, _.isEmpty(rootItems));
179173
return rootItems;
180174
} finally {
181-
this._lock.release();
175+
explorerLock.release();
182176
}
183177
}
184178
}

src/views/dependencyExplorer.ts

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import * as fse from "fs-extra";
55
import * as _ from "lodash";
66
import * as path from "path";
7-
import { commands, Disposable, ExtensionContext, QuickPickItem, TextEditor, TreeView,
8-
TreeViewExpansionEvent, TreeViewSelectionChangeEvent, TreeViewVisibilityChangeEvent, Uri, window } from "vscode";
7+
import {
8+
commands, Disposable, ExtensionContext, QuickPickItem, TextEditor, TreeView,
9+
TreeViewExpansionEvent, TreeViewSelectionChangeEvent, TreeViewVisibilityChangeEvent, Uri, window,
10+
} from "vscode";
911
import { instrumentOperationAsVsCodeCommand, sendInfo } from "vscode-extension-telemetry-wrapper";
1012
import { Commands } from "../commands";
1113
import { Build } from "../constants";
@@ -17,7 +19,6 @@ import { Jdtls } from "../java/jdtls";
1719
import { INodeData } from "../java/nodeData";
1820
import { Settings } from "../settings";
1921
import { EventCounter, Utility } from "../utility";
20-
import { Lock } from "../utils/Lock";
2122
import { DataNode } from "./dataNode";
2223
import { DependencyDataProvider } from "./dependencyDataProvider";
2324
import { ExplorerNode } from "./explorerNode";
@@ -34,8 +35,6 @@ export class DependencyExplorer implements Disposable {
3435

3536
private static _instance: DependencyExplorer;
3637

37-
private _lock: Lock = new Lock();
38-
3938
private _dependencyViewer: TreeView<ExplorerNode>;
4039

4140
private _dataProvider: DependencyDataProvider;
@@ -54,7 +53,7 @@ export class DependencyExplorer implements Disposable {
5453
}),
5554
this._dependencyViewer.onDidChangeVisibility((e: TreeViewVisibilityChangeEvent) => {
5655
if (e.visible) {
57-
sendInfo("", {projectManagerVisible: 1});
56+
sendInfo("", { projectManagerVisible: 1 });
5857
if (window.activeTextEditor) {
5958
this.reveal(window.activeTextEditor.document.uri);
6059
}
@@ -145,33 +144,27 @@ export class DependencyExplorer implements Disposable {
145144
}
146145

147146
public async reveal(uri: Uri, needCheckSyncSetting: boolean = true): Promise<void> {
148-
try {
149-
await this._lock.acquire();
150-
151-
if (needCheckSyncSetting && !Settings.syncWithFolderExplorer()) {
152-
return;
153-
}
154-
155-
if (!await Utility.isRevealable(uri)) {
156-
return;
157-
}
147+
if (needCheckSyncSetting && !Settings.syncWithFolderExplorer()) {
148+
return;
149+
}
158150

159-
let node: DataNode | undefined = explorerNodeCache.getDataNode(uri);
160-
if (!node) {
161-
const paths: INodeData[] = await Jdtls.resolvePath(uri.toString());
162-
if (!_.isEmpty(paths)) {
163-
node = await this._dataProvider.revealPaths(paths);
164-
}
165-
}
151+
if (!await Utility.isRevealable(uri)) {
152+
return;
153+
}
166154

167-
if (!node) {
168-
return;
155+
let node: DataNode | undefined = explorerNodeCache.getDataNode(uri);
156+
if (!node) {
157+
const paths: INodeData[] = await Jdtls.resolvePath(uri.toString());
158+
if (!_.isEmpty(paths)) {
159+
node = await this._dataProvider.revealPaths(paths);
169160
}
161+
}
170162

171-
await this._dependencyViewer.reveal(node);
172-
} finally {
173-
this._lock.release();
163+
if (!node) {
164+
return;
174165
}
166+
167+
await this._dependencyViewer.reveal(node);
175168
}
176169

177170
public get dataProvider(): DependencyDataProvider {

src/views/hierarchicalPackageNode.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import * as _ from "lodash";
55
import { TreeItem, TreeItemCollapsibleState } from "vscode";
66
import { HierarchicalPackageNodeData } from "../java/hierarchicalPackageNodeData";
77
import { INodeData, NodeKind } from "../java/nodeData";
8+
import { explorerLock } from "../utils/Lock";
89
import { DataNode } from "./dataNode";
910
import { ExplorerNode } from "./explorerNode";
1011
import { FileNode } from "./fileNode";
@@ -26,7 +27,7 @@ export class HierarchicalPackageNode extends PackageNode {
2627

2728
public async getChildren(): Promise<ExplorerNode[]> {
2829
try {
29-
await this._lock.acquire();
30+
await explorerLock.acquireAsync();
3031
const data = await this.loadData();
3132
if (data) {
3233
if (this.nodeData?.children) {
@@ -38,7 +39,7 @@ export class HierarchicalPackageNode extends PackageNode {
3839
}
3940
return this.createChildNodeList();
4041
} finally {
41-
this._lock.release();
42+
explorerLock.release();
4243
}
4344
}
4445

0 commit comments

Comments
 (0)