diff --git a/src/vs/workbench/api/browser/mainThreadComments.ts b/src/vs/workbench/api/browser/mainThreadComments.ts index 3371106e1a5..9a6f866362c 100644 --- a/src/vs/workbench/api/browser/mainThreadComments.ts +++ b/src/vs/workbench/api/browser/mainThreadComments.ts @@ -366,6 +366,14 @@ export class MainThreadCommentController { thread.dispose(); } + deleteCommentThreadMain(commentThreadId: string) { + this._threads.forEach(thread => { + if (thread.threadId === commentThreadId) { + this._proxy.$deleteCommentThread(this._handle, thread.commentThreadHandle); + } + }); + } + updateInput(input: string) { let thread = this.activeCommentThread; diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index e5a79e59dbb..3386015e6c4 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1210,6 +1210,7 @@ export interface ExtHostCommentsShape { $createNewCommentThread(handle: number, document: UriComponents, range: IRange, text: string): Promise; $createCommentThreadTemplate(commentControllerHandle: number, uriComponents: UriComponents, range: IRange): void; $onCommentWidgetInputChange(commentControllerHandle: number, document: UriComponents, range: IRange, input: string | undefined): Promise; + $deleteCommentThread(commentControllerHandle: number, commentThreadHandle: number): void; $provideCommentingRanges(commentControllerHandle: number, uriComponents: UriComponents, token: CancellationToken): Promise; $checkStaticContribution(commentControllerHandle: number): Promise; $provideReactionGroup(commentControllerHandle: number): Promise; diff --git a/src/vs/workbench/api/common/extHostComments.ts b/src/vs/workbench/api/common/extHostComments.ts index fb783e83775..9276ca5f685 100644 --- a/src/vs/workbench/api/common/extHostComments.ts +++ b/src/vs/workbench/api/common/extHostComments.ts @@ -173,6 +173,14 @@ export class ExtHostComments implements ExtHostCommentsShape { return Promise.resolve(commentControllerHandle); } + $deleteCommentThread(commentControllerHandle: number, commentThreadHandle: number) { + const commentController = this._commentControllers.get(commentControllerHandle); + + if (commentController) { + commentController.$deleteCommentThread(commentThreadHandle); + } + } + $provideCommentingRanges(commentControllerHandle: number, uriComponents: UriComponents, token: CancellationToken): Promise { const commentController = this._commentControllers.get(commentControllerHandle); @@ -764,6 +772,16 @@ class ExtHostCommentController implements vscode.CommentController { return commentThread; } + $deleteCommentThread(threadHandle: number) { + let thread = this._threads.get(threadHandle); + + if (thread) { + thread.dispose(); + } + + this._threads.delete(threadHandle); + } + $onCommentWidgetInputChange(uriComponents: UriComponents, range: IRange, input: string) { if (!this.inputBox) { this.inputBox = new ExtHostCommentInputBox(this._proxy, this.handle, URI.revive(uriComponents), extHostTypeConverter.Range.to(range), input); diff --git a/src/vs/workbench/contrib/comments/browser/commentService.ts b/src/vs/workbench/contrib/comments/browser/commentService.ts index 86ee098d6b2..4823e3aec3a 100644 --- a/src/vs/workbench/contrib/comments/browser/commentService.ts +++ b/src/vs/workbench/contrib/comments/browser/commentService.ts @@ -52,6 +52,7 @@ export interface ICommentService { registerDataProvider(owner: string, commentProvider: DocumentCommentProvider): void; unregisterDataProvider(owner: string): void; updateComments(ownerId: string, event: CommentThreadChangedEvent): void; + disposeCommentThread(ownerId: string, threadId: string): void; createNewCommentThread(owner: string, resource: URI, range: Range, text: string): Promise; replyToCommentThread(owner: string, resource: URI, range: Range, thread: CommentThread, text: string): Promise; editComment(owner: string, resource: URI, comment: Comment, text: string): Promise; @@ -144,6 +145,13 @@ export class CommentService extends Disposable implements ICommentService { commentController.createCommentThreadTemplate(resource, range); } + disposeCommentThread(owner: string, threadId: string) { + let controller = this.getCommentController(owner); + if (controller) { + controller.deleteCommentThreadMain(threadId); + } + } + getCommentMenus(owner: string): CommentMenus { if (this._commentMenus.get(owner)) { return this._commentMenus.get(owner)!; diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts index d9a4fb60eac..03dc6863c89 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadWidget.ts @@ -267,6 +267,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget if (deleteCommand) { return this.commandService.executeCommand(deleteCommand.id, ...(deleteCommand.arguments || [])); } else if (this._commentEditor.getValue() === '') { + this.commentService.disposeCommentThread(this._owner, this._commentThread.threadId!); this.dispose(); return Promise.resolve(); }