diff --git a/extensions/git-extended/src/prView/prProvider.ts b/extensions/git-extended/src/prView/prProvider.ts index f88b8bbcffa..adc63a82ece 100644 --- a/extensions/git-extended/src/prView/prProvider.ts +++ b/extensions/git-extended/src/prView/prProvider.ts @@ -158,7 +158,11 @@ export class PRProvider implements vscode.TreeDataProvider(); + setTimeout(() => _onDidChangeCommentThreads.fire({ changed: [], added: [], removed: [] }), 5000); vscode.workspace.registerCommentProvider({ + onDidChangeCommentThreads: _onDidChangeCommentThreads.event, provideNewCommentRange: async (document: vscode.TextDocument, token: vscode.CancellationToken) => { if (document.uri.scheme === 'pr') { let params = JSON.parse(document.uri.query); diff --git a/extensions/git-extended/src/review/reviewMode.ts b/extensions/git-extended/src/review/reviewMode.ts index a9d88d6ded3..d10554fcd22 100644 --- a/extensions/git-extended/src/review/reviewMode.ts +++ b/extensions/git-extended/src/review/reviewMode.ts @@ -170,7 +170,9 @@ export class ReviewMode { return ret; } - this._commentProvider = vscode.workspace.registerCommentProvider({ + const _onDidChangeCommentThreads = new vscode.EventEmitter(); + vscode.workspace.registerCommentProvider({ + onDidChangeCommentThreads: _onDidChangeCommentThreads.event, provideNewCommentRange: async (document: vscode.TextDocument, token: vscode.CancellationToken) => { if (document.uri.scheme === 'review' || document.uri.scheme === 'file') { let lastLine = document.lineCount; diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 56eeb3b4c9f..942fd91ec34 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -957,10 +957,29 @@ export interface Comment { readonly gravatar: string; } +export interface CommentThreadChangedEvent { + /** + * Added comment threads. + */ + readonly added: CommentThread[]; + + /** + * Removed comment threads. + */ + readonly removed: CommentThread[]; + + /** + * Changed comment threads. + */ + readonly changed: CommentThread[]; +} + + export interface CommentProvider { provideComments(model: model.ITextModel, token: CancellationToken): CommentThread[]; provideNewCommentRange(model: model.ITextModel, token: CancellationToken): Promise; provideAllComments(token: CancellationToken): Promise; + onDidChangeCommentThreads(): Event; } export interface ICodeLensSymbol { diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 6a02849802f..cb42a57a7f5 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -5047,10 +5047,26 @@ declare namespace monaco.languages { readonly gravatar: string; } + export interface CommentThreadChangedEvent { + /** + * Added comment threads. + */ + readonly added: CommentThread[]; + /** + * Removed comment threads. + */ + readonly removed: CommentThread[]; + /** + * Changed comment threads. + */ + readonly changed: CommentThread[]; + } + export interface CommentProvider { provideComments(model: editor.ITextModel, token: CancellationToken): CommentThread[]; provideNewCommentRange(model: editor.ITextModel, token: CancellationToken): Promise; provideAllComments(token: CancellationToken): Promise; + onDidChangeCommentThreads(): IEvent; } export interface ICodeLensSymbol { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index c6a09c6db2b..501e3f02956 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -789,6 +789,23 @@ declare module 'vscode' { gravatar: string; } + export interface CommentThreadChangedEvent { + /** + * Added comment threads. + */ + readonly added: CommentThread[]; + + /** + * Removed comment threads. + */ + readonly removed: CommentThread[]; + + /** + * Changed comment threads. + */ + readonly changed: CommentThread[]; + } + /** * TODO: force update event? * TODO: resolve step? @@ -797,6 +814,7 @@ declare module 'vscode' { provideComments(document: TextDocument, token: CancellationToken): Promise; provideNewCommentRange(document: TextDocument, token: CancellationToken): Promise; provideAllComments?(token: CancellationToken): Promise; + onDidChangeCommentThreads?: Event; } namespace workspace { diff --git a/src/vs/workbench/api/electron-browser/mainThreadComments.ts b/src/vs/workbench/api/electron-browser/mainThreadComments.ts index 2f28d8bedca..c684c79bed8 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadComments.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadComments.ts @@ -67,8 +67,10 @@ export class MainThreadComments extends Disposable implements MainThreadComments this._panelService.setPanelEnablement(COMMENTS_PANEL_ID, true); } }); + } - + $onDidCommentThreadsChange(handle: number, event: modes.CommentThreadChangedEvent) { + // notify comment service } $unregisterCommentProvider(handle: number): void { diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 3d1d6c9683e..a7f9cbbd692 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -107,6 +107,7 @@ export interface MainThreadCommandsShape extends IDisposable { export interface MainThreadCommentsShape extends IDisposable { $registerCommentProvider(handle: number): void; $unregisterCommentProvider(handle: number): void; + $onDidCommentThreadsChange(handle: number, event: modes.CommentThreadChangedEvent): void; } export interface MainThreadConfigurationShape extends IDisposable { diff --git a/src/vs/workbench/api/node/extHostComments.ts b/src/vs/workbench/api/node/extHostComments.ts index a1804f7ab3b..7fb835c4aa8 100644 --- a/src/vs/workbench/api/node/extHostComments.ts +++ b/src/vs/workbench/api/node/extHostComments.ts @@ -37,6 +37,15 @@ export class ExtHostComments implements ExtHostCommentsShape { this._providers.set(handle, provider); this._proxy.$registerCommentProvider(handle); + + provider.onDidChangeCommentThreads(event => { + + this._proxy.$onDidCommentThreadsChange(handle, { + changed: event.changed.map(x => convertCommentThread(x, this._commandsConverter)), + added: event.added.map(x => convertCommentThread(x, this._commandsConverter)), + removed: event.removed.map(x => convertCommentThread(x, this._commandsConverter)) + }); + }); return { dispose: () => { this._proxy.$unregisterCommentProvider(handle); @@ -45,6 +54,10 @@ export class ExtHostComments implements ExtHostCommentsShape { }; } + $onDidCommentThreadsChange(handle: number, commentThreadEvent: vscode.CommentThreadChangedEvent) { + return TPromise.as(null); + } + $provideComments(handle: number, uri: UriComponents): TPromise { const data = this._documents.getDocumentData(URI.revive(uri)); if (!data || !data.document) {