This is an automated email from the ASF dual-hosted git repository. sdedic pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push: new 822fd9c Dispose/disconnect tree view after client stop. new 3ded4d1 Merge pull request #3348 from sdedic/vscode/tree-on-restart 822fd9c is described below commit 822fd9c72d0a35b2d003526b6065915e684de83b Author: Svata Dedic <svatopluk.de...@oracle.com> AuthorDate: Wed Dec 1 14:20:23 2021 +0100 Dispose/disconnect tree view after client stop. --- java/java.lsp.server/vscode/src/explorer.ts | 36 ++++++++++++++++++++++------ java/java.lsp.server/vscode/src/extension.ts | 8 +++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/java/java.lsp.server/vscode/src/explorer.ts b/java/java.lsp.server/vscode/src/explorer.ts index 87f7169..1bb537a 100644 --- a/java/java.lsp.server/vscode/src/explorer.ts +++ b/java/java.lsp.server/vscode/src/explorer.ts @@ -1,14 +1,17 @@ +import { disconnect } from 'process'; import * as vscode from 'vscode'; import { LanguageClient } from 'vscode-languageclient/node'; import { NbLanguageClient } from './extension'; import { NodeChangedParams, NodeInfoNotification, NodeInfoRequest } from './protocol'; -export class TreeViewService { +export class TreeViewService extends vscode.Disposable { + private handler : vscode.Disposable | undefined; private client : NbLanguageClient; private trees : Map<string, vscode.TreeView<Visualizer>> = new Map(); private images : Map<number, vscode.Uri> = new Map(); private providers : Map<number, VisualizerProvider> = new Map(); - constructor (c : NbLanguageClient) { + constructor (c : NbLanguageClient, disposeFunc : () => void) { + super(() => { this.disposeAllViews(); disposeFunc(); }); this.client = c; } @@ -16,6 +19,18 @@ export class TreeViewService { return this.client; } + private disposeAllViews() : void { + for (let tree of this.trees.values()) { + tree.dispose(); + } + for (let provider of this.providers.values()) { + provider.dispose(); + } + this.trees.clear(); + this.providers.clear(); + this.handler?.dispose(); + } + public async createView(id : string, title? : string, options? : Partial<vscode.TreeViewOptions<any>>) : Promise<vscode.TreeView<Visualizer>> { let tv : vscode.TreeView<Visualizer> | undefined = this.trees.get(id); if (tv) { @@ -36,8 +51,9 @@ export class TreeViewService { opts.showCollapseAll = options.showCollapseAll; } let view = vscode.window.createTreeView(id, opts); + this.trees.set(id, view); // this will replace the handler over and over, but never mind - this.client.onNotification(NodeInfoNotification.type, params => this.nodeChanged(params)); + this.handler = this.client.onNotification(NodeInfoNotification.type, params => this.nodeChanged(params)); return view; } @@ -60,7 +76,7 @@ export class TreeViewService { } -class VisualizerProvider implements vscode.TreeDataProvider<Visualizer> { +class VisualizerProvider extends vscode.Disposable implements vscode.TreeDataProvider<Visualizer> { private root: Visualizer; private treeData : Map<number, Visualizer> = new Map(); @@ -70,12 +86,17 @@ class VisualizerProvider implements vscode.TreeDataProvider<Visualizer> { id : string, rootData : NodeInfoRequest.Data ) { + super(() => this.disconnect()); this.root = new Visualizer(rootData, ts.imageUri(rootData)); this.treeData.set(rootData.id, this.root); } private _onDidChangeTreeData: vscode.EventEmitter<Visualizer | undefined | null | void> = new vscode.EventEmitter<Visualizer | undefined | null | void>(); readonly onDidChangeTreeData: vscode.Event<Visualizer | undefined | null | void> = this._onDidChangeTreeData.event; + + private disconnect() : void { + // nothing at the moment. + } refresh(params : NodeChangedParams): void { if (this.root.data.id === params.rootId) { @@ -213,15 +234,16 @@ export async function createTreeView<T>(c: NbLanguageClient, viewId: string, vie * Registers the treeview service with the language server. */ export function createTreeViewService(c : NbLanguageClient): TreeViewService { - const ts : TreeViewService = new TreeViewService(c); - vscode.commands.registerCommand("foundProjects.deleteEntry", async function (this: any, args: any) { + const d = vscode.commands.registerCommand("foundProjects.deleteEntry", async function (this: any, args: any) { let v = args as Visualizer; let ok = await c.sendRequest(NodeInfoRequest.destroy, { nodeId : v.data.id }); if (!ok) { vscode.window.showErrorMessage('Cannot delete node ' + v.label); } }); - + const ts : TreeViewService = new TreeViewService(c, () => { + d.dispose() + }); return ts; } diff --git a/java/java.lsp.server/vscode/src/extension.ts b/java/java.lsp.server/vscode/src/extension.ts index 57062e8..19446e5 100644 --- a/java/java.lsp.server/vscode/src/extension.ts +++ b/java/java.lsp.server/vscode/src/extension.ts @@ -70,6 +70,14 @@ export class NbLanguageClient extends LanguageClient { findTreeViewService(): TreeViewService { return this._treeViewService; } + + stop(): Promise<void> { + // stop will be called even in case of external close & client restart, so OK. + const r: Promise<void> = super.stop(); + this._treeViewService.dispose(); + return r; + } + } function handleLog(log: vscode.OutputChannel, msg: string): void { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists