diff --git a/src/vs/workbench/api/browser/mainThreadComments.ts b/src/vs/workbench/api/browser/mainThreadComments.ts index 0ecd0d8a195..29f7b613e5a 100644 --- a/src/vs/workbench/api/browser/mainThreadComments.ts +++ b/src/vs/workbench/api/browser/mainThreadComments.ts @@ -486,6 +486,7 @@ export class MainThreadComments extends Disposable implements MainThreadComments ) { super(); this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostComments); + this._commentService.unregisterCommentController(); this._register(this._commentService.onDidChangeActiveCommentThread(async thread => { const handle = (thread as MainThreadCommentThread).controllerHandle; diff --git a/src/vs/workbench/api/common/extHostComments.ts b/src/vs/workbench/api/common/extHostComments.ts index 13f02e08b35..c44e10e1acc 100644 --- a/src/vs/workbench/api/common/extHostComments.ts +++ b/src/vs/workbench/api/common/extHostComments.ts @@ -7,7 +7,7 @@ import { asPromise } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { debounce } from 'vs/base/common/decorators'; import { Emitter } from 'vs/base/common/event'; -import { DisposableStore, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle'; +import { DisposableStore, MutableDisposable } from 'vs/base/common/lifecycle'; import { MarshalledId } from 'vs/base/common/marshallingIds'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IRange } from 'vs/editor/common/core/range'; @@ -31,7 +31,7 @@ interface ExtHostComments { export function createExtHostComments(mainContext: IMainContext, commands: ExtHostCommands, documents: ExtHostDocuments): ExtHostCommentsShape & ExtHostComments { const proxy = mainContext.getProxy(MainContext.MainThreadComments); - class ExtHostCommentsImpl implements ExtHostCommentsShape, ExtHostComments, IDisposable { + class ExtHostCommentsImpl implements ExtHostCommentsShape, ExtHostComments { private static handlePool = 0; @@ -244,9 +244,6 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo return Promise.resolve(undefined); }); } - dispose() { - - } } type CommentThreadModification = Partial<{ range: vscode.Range; diff --git a/src/vs/workbench/contrib/comments/browser/commentService.ts b/src/vs/workbench/contrib/comments/browser/commentService.ts index 5dc5ddf30e6..6a8cc9c290c 100644 --- a/src/vs/workbench/contrib/comments/browser/commentService.ts +++ b/src/vs/workbench/contrib/comments/browser/commentService.ts @@ -80,14 +80,14 @@ export interface ICommentService { readonly onDidUpdateCommentingRanges: Event<{ owner: string }>; readonly onDidChangeActiveCommentingRange: Event<{ range: Range; commentingRangesInfo: CommentingRanges }>; readonly onDidSetDataProvider: Event; - readonly onDidDeleteDataProvider: Event; + readonly onDidDeleteDataProvider: Event; readonly onDidChangeCommentingEnabled: Event; readonly isCommentingEnabled: boolean; setDocumentComments(resource: URI, commentInfos: ICommentInfo[]): void; setWorkspaceComments(owner: string, commentsByResource: CommentThread[]): void; removeWorkspaceComments(owner: string): void; registerCommentController(owner: string, commentControl: ICommentController): void; - unregisterCommentController(owner: string): void; + unregisterCommentController(owner?: string): void; getCommentController(owner: string): ICommentController | undefined; createCommentThreadTemplate(owner: string, resource: URI, range: Range | undefined): void; updateCommentThreadTemplate(owner: string, threadHandle: number, range: Range): Promise; @@ -111,8 +111,8 @@ export class CommentService extends Disposable implements ICommentService { private readonly _onDidSetDataProvider: Emitter = this._register(new Emitter()); readonly onDidSetDataProvider: Event = this._onDidSetDataProvider.event; - private readonly _onDidDeleteDataProvider: Emitter = this._register(new Emitter()); - readonly onDidDeleteDataProvider: Event = this._onDidDeleteDataProvider.event; + private readonly _onDidDeleteDataProvider: Emitter = this._register(new Emitter()); + readonly onDidDeleteDataProvider: Event = this._onDidDeleteDataProvider.event; private readonly _onDidSetResourceCommentInfos: Emitter = this._register(new Emitter()); readonly onDidSetResourceCommentInfos: Event = this._onDidSetResourceCommentInfos.event; @@ -239,8 +239,12 @@ export class CommentService extends Disposable implements ICommentService { this._onDidSetDataProvider.fire(); } - unregisterCommentController(owner: string): void { - this._commentControls.delete(owner); + unregisterCommentController(owner?: string): void { + if (owner) { + this._commentControls.delete(owner); + } else { + this._commentControls.clear(); + } this._onDidDeleteDataProvider.fire(owner); } diff --git a/src/vs/workbench/contrib/comments/browser/commentsController.ts b/src/vs/workbench/contrib/comments/browser/commentsController.ts index fab32d698f1..53fa7b55c35 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsController.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsController.ts @@ -353,8 +353,13 @@ export class CommentController implements IEditorContribution { this.globalToDispose.add(this._commentThreadRangeDecorator = new CommentThreadRangeDecorator(this.commentService)); this.globalToDispose.add(this.commentService.onDidDeleteDataProvider(ownerId => { - delete this._pendingNewCommentCache[ownerId]; - delete this._pendingEditsCache[ownerId]; + if (ownerId) { + delete this._pendingNewCommentCache[ownerId]; + delete this._pendingEditsCache[ownerId]; + } else { + this._pendingNewCommentCache = {}; + this._pendingEditsCache = {}; + } this.beginCompute(); })); this.globalToDispose.add(this.commentService.onDidSetDataProvider(_ => this.beginCompute())); diff --git a/src/vs/workbench/contrib/comments/browser/commentsView.ts b/src/vs/workbench/contrib/comments/browser/commentsView.ts index 5a787f30cc0..c04e4bfb30e 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsView.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsView.ts @@ -191,6 +191,7 @@ export class CommentsPanel extends FilterViewPane implements ICommentsView { this._register(this.commentService.onDidSetAllCommentThreads(this.onAllCommentsChanged, this)); this._register(this.commentService.onDidUpdateCommentThreads(this.onCommentsUpdated, this)); + this._register(this.commentService.onDidDeleteDataProvider(this.onDataProviderDeleted, this)); const styleElement = dom.createStyleSheet(container); this.applyStyles(styleElement); @@ -470,6 +471,14 @@ export class CommentsPanel extends FilterViewPane implements ICommentsView { } } + private onDataProviderDeleted(owner: string | undefined): void { + this.cachedFilterStats = undefined; + this.commentsModel.deleteCommentsByOwner(owner); + + this.totalComments = 0; + this.refresh(); + } + private updateSomeCommentsExpanded() { this.someCommentsExpandedContextKey.set(this.isSomeCommentsExpanded()); } diff --git a/src/vs/workbench/contrib/comments/common/commentModel.ts b/src/vs/workbench/contrib/comments/common/commentModel.ts index 7f842927670..5ee5ab1f657 100644 --- a/src/vs/workbench/contrib/comments/common/commentModel.ts +++ b/src/vs/workbench/contrib/comments/common/commentModel.ts @@ -85,6 +85,15 @@ export class CommentsModel { this.updateResourceCommentThreads(); } + public deleteCommentsByOwner(owner?: string): void { + if (owner) { + this.commentThreadsMap.set(owner, []); + } else { + this.commentThreadsMap.clear(); + } + this.updateResourceCommentThreads(); + } + public updateCommentThreads(event: ICommentThreadChangedEvent): boolean { const { owner, removed, changed, added } = event;