Skip to content

Commit fe5f523

Browse files
committed
Add extension information to comment widget model
1 parent 8c2cef9 commit fe5f523

5 files changed

Lines changed: 74 additions & 46 deletions

File tree

src/vs/editor/common/modes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,6 +1149,7 @@ export interface Command {
11491149
* @internal
11501150
*/
11511151
export interface CommentInfo {
1152+
extensionId: string;
11521153
threads: CommentThread[];
11531154
commentingRanges?: IRange[];
11541155
reply?: Command;
@@ -1182,6 +1183,7 @@ export enum CommentThreadCollapsibleState {
11821183
* @internal
11831184
*/
11841185
export interface CommentThread {
1186+
extensionId: string;
11851187
threadId: string;
11861188
resource: string;
11871189
range: IRange;

src/vs/workbench/api/node/extHost.api.impl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ export function createApiFactory(
627627
return extHostSearch.registerFileIndexProvider(scheme, provider);
628628
}),
629629
registerDocumentCommentProvider: proposedApiFunction(extension, (provider: vscode.DocumentCommentProvider) => {
630-
return exthostCommentProviders.registerDocumentCommentProvider(provider);
630+
return exthostCommentProviders.registerDocumentCommentProvider(extension.identifier, provider);
631631
}),
632632
registerWorkspaceCommentProvider: proposedApiFunction(extension, (provider: vscode.WorkspaceCommentProvider) => {
633633
return exthostCommentProviders.registerWorkspaceCommentProvider(extension.identifier, provider);

src/vs/workbench/api/node/extHostComments.ts

Lines changed: 51 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,19 @@ import { IRange } from 'vs/editor/common/core/range';
1515
import { CancellationToken } from 'vs/base/common/cancellation';
1616
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
1717

18+
interface HandlerData<T> {
19+
20+
extensionId: ExtensionIdentifier;
21+
provider: T;
22+
}
23+
1824
export class ExtHostComments implements ExtHostCommentsShape {
1925
private static handlePool = 0;
2026

2127
private _proxy: MainThreadCommentsShape;
2228

23-
private _documentProviders = new Map<number, vscode.DocumentCommentProvider>();
24-
private _workspaceProviders = new Map<number, vscode.WorkspaceCommentProvider>();
29+
private _documentProviders = new Map<number, HandlerData<vscode.DocumentCommentProvider>>();
30+
private _workspaceProviders = new Map<number, HandlerData<vscode.WorkspaceCommentProvider>>();
2531

2632
constructor(
2733
mainContext: IMainContext,
@@ -36,9 +42,12 @@ export class ExtHostComments implements ExtHostCommentsShape {
3642
provider: vscode.WorkspaceCommentProvider
3743
): vscode.Disposable {
3844
const handle = ExtHostComments.handlePool++;
39-
this._workspaceProviders.set(handle, provider);
45+
this._workspaceProviders.set(handle, {
46+
extensionId,
47+
provider
48+
});
4049
this._proxy.$registerWorkspaceCommentProvider(handle, extensionId);
41-
this.registerListeners(handle, provider);
50+
this.registerListeners(handle, extensionId, provider);
4251

4352
return {
4453
dispose: () => {
@@ -49,16 +58,20 @@ export class ExtHostComments implements ExtHostCommentsShape {
4958
}
5059

5160
registerDocumentCommentProvider(
61+
extensionId: ExtensionIdentifier,
5262
provider: vscode.DocumentCommentProvider
5363
): vscode.Disposable {
5464
const handle = ExtHostComments.handlePool++;
55-
this._documentProviders.set(handle, provider);
65+
this._documentProviders.set(handle, {
66+
extensionId,
67+
provider
68+
});
5669
this._proxy.$registerDocumentCommentProvider(handle, {
5770
startDraftLabel: provider.startDraftLabel,
5871
deleteDraftLabel: provider.deleteDraftLabel,
5972
finishDraftLabel: provider.finishDraftLabel
6073
});
61-
this.registerListeners(handle, provider);
74+
this.registerListeners(handle, extensionId, provider);
6275

6376
return {
6477
dispose: () => {
@@ -76,10 +89,10 @@ export class ExtHostComments implements ExtHostCommentsShape {
7689
return Promise.resolve(null);
7790
}
7891

79-
const provider = this._documentProviders.get(handle);
92+
const handlerData = this._documentProviders.get(handle);
8093
return asPromise(() => {
81-
return provider.createNewCommentThread(data.document, ran, text, CancellationToken.None);
82-
}).then(commentThread => commentThread ? convertToCommentThread(provider, commentThread, this._commandsConverter) : null);
94+
return handlerData.provider.createNewCommentThread(data.document, ran, text, CancellationToken.None);
95+
}).then(commentThread => commentThread ? convertToCommentThread(handlerData.extensionId, handlerData.provider, commentThread, this._commandsConverter) : null);
8396
}
8497

8598
$replyToCommentThread(handle: number, uri: UriComponents, range: IRange, thread: modes.CommentThread, text: string): Promise<modes.CommentThread | null> {
@@ -90,10 +103,10 @@ export class ExtHostComments implements ExtHostCommentsShape {
90103
return Promise.resolve(null);
91104
}
92105

93-
const provider = this._documentProviders.get(handle);
106+
const handlerData = this._documentProviders.get(handle);
94107
return asPromise(() => {
95-
return provider.replyToCommentThread(data.document, ran, convertFromCommentThread(thread), text, CancellationToken.None);
96-
}).then(commentThread => commentThread ? convertToCommentThread(provider, commentThread, this._commandsConverter) : null);
108+
return handlerData.provider.replyToCommentThread(data.document, ran, convertFromCommentThread(thread), text, CancellationToken.None);
109+
}).then(commentThread => commentThread ? convertToCommentThread(handlerData.extensionId, handlerData.provider, commentThread, this._commandsConverter) : null);
97110
}
98111

99112
$editComment(handle: number, uri: UriComponents, comment: modes.Comment, text: string): Promise<void> {
@@ -103,9 +116,9 @@ export class ExtHostComments implements ExtHostCommentsShape {
103116
throw new Error('Unable to retrieve document from URI');
104117
}
105118

106-
const provider = this._documentProviders.get(handle);
119+
const handlerData = this._documentProviders.get(handle);
107120
return asPromise(() => {
108-
return provider.editComment(data.document, convertFromComment(comment), text, CancellationToken.None);
121+
return handlerData.provider.editComment(data.document, convertFromComment(comment), text, CancellationToken.None);
109122
});
110123
}
111124

@@ -116,9 +129,9 @@ export class ExtHostComments implements ExtHostCommentsShape {
116129
throw new Error('Unable to retrieve document from URI');
117130
}
118131

119-
const provider = this._documentProviders.get(handle);
132+
const handlerData = this._documentProviders.get(handle);
120133
return asPromise(() => {
121-
return provider.deleteComment(data.document, convertFromComment(comment), CancellationToken.None);
134+
return handlerData.provider.deleteComment(data.document, convertFromComment(comment), CancellationToken.None);
122135
});
123136
}
124137

@@ -129,9 +142,9 @@ export class ExtHostComments implements ExtHostCommentsShape {
129142
throw new Error('Unable to retrieve document from URI');
130143
}
131144

132-
const provider = this._documentProviders.get(handle);
145+
const handlerData = this._documentProviders.get(handle);
133146
return asPromise(() => {
134-
return provider.startDraft(data.document, CancellationToken.None);
147+
return handlerData.provider.startDraft(data.document, CancellationToken.None);
135148
});
136149
}
137150

@@ -142,9 +155,9 @@ export class ExtHostComments implements ExtHostCommentsShape {
142155
throw new Error('Unable to retrieve document from URI');
143156
}
144157

145-
const provider = this._documentProviders.get(handle);
158+
const handlerData = this._documentProviders.get(handle);
146159
return asPromise(() => {
147-
return provider.deleteDraft(data.document, CancellationToken.None);
160+
return handlerData.provider.deleteDraft(data.document, CancellationToken.None);
148161
});
149162
}
150163

@@ -155,9 +168,9 @@ export class ExtHostComments implements ExtHostCommentsShape {
155168
throw new Error('Unable to retrieve document from URI');
156169
}
157170

158-
const provider = this._documentProviders.get(handle);
171+
const handlerData = this._documentProviders.get(handle);
159172
return asPromise(() => {
160-
return provider.finishDraft(data.document, CancellationToken.None);
173+
return handlerData.provider.finishDraft(data.document, CancellationToken.None);
161174
});
162175
}
163176

@@ -167,48 +180,50 @@ export class ExtHostComments implements ExtHostCommentsShape {
167180
return Promise.resolve(null);
168181
}
169182

170-
const provider = this._documentProviders.get(handle);
183+
const handlerData = this._documentProviders.get(handle);
171184
return asPromise(() => {
172-
return provider.provideDocumentComments(data.document, CancellationToken.None);
173-
}).then(commentInfo => commentInfo ? convertCommentInfo(handle, provider, commentInfo, this._commandsConverter) : null);
185+
return handlerData.provider.provideDocumentComments(data.document, CancellationToken.None);
186+
}).then(commentInfo => commentInfo ? convertCommentInfo(handle, handlerData.extensionId, handlerData.provider, commentInfo, this._commandsConverter) : null);
174187
}
175188

176189
$provideWorkspaceComments(handle: number): Promise<modes.CommentThread[] | null> {
177-
const provider = this._workspaceProviders.get(handle);
178-
if (!provider) {
190+
const handlerData = this._workspaceProviders.get(handle);
191+
if (!handlerData) {
179192
return Promise.resolve(null);
180193
}
181194

182195
return asPromise(() => {
183-
return provider.provideWorkspaceComments(CancellationToken.None);
196+
return handlerData.provider.provideWorkspaceComments(CancellationToken.None);
184197
}).then(comments =>
185-
comments.map(comment => convertToCommentThread(provider, comment, this._commandsConverter)
198+
comments.map(comment => convertToCommentThread(handlerData.extensionId, handlerData.provider, comment, this._commandsConverter)
186199
));
187200
}
188201

189-
private registerListeners(handle: number, provider: vscode.DocumentCommentProvider | vscode.WorkspaceCommentProvider) {
202+
private registerListeners(handle: number, extensionId: ExtensionIdentifier, provider: vscode.DocumentCommentProvider | vscode.WorkspaceCommentProvider) {
190203
provider.onDidChangeCommentThreads(event => {
191204

192205
this._proxy.$onDidCommentThreadsChange(handle, {
193-
changed: event.changed.map(thread => convertToCommentThread(provider, thread, this._commandsConverter)),
194-
added: event.added.map(thread => convertToCommentThread(provider, thread, this._commandsConverter)),
195-
removed: event.removed.map(thread => convertToCommentThread(provider, thread, this._commandsConverter)),
206+
changed: event.changed.map(thread => convertToCommentThread(extensionId, provider, thread, this._commandsConverter)),
207+
added: event.added.map(thread => convertToCommentThread(extensionId, provider, thread, this._commandsConverter)),
208+
removed: event.removed.map(thread => convertToCommentThread(extensionId, provider, thread, this._commandsConverter)),
196209
draftMode: !!(provider as vscode.DocumentCommentProvider).startDraft && !!(provider as vscode.DocumentCommentProvider).finishDraft ? (event.inDraftMode ? modes.DraftMode.InDraft : modes.DraftMode.NotInDraft) : modes.DraftMode.NotSupported
197210
});
198211
});
199212
}
200213
}
201214

202-
function convertCommentInfo(owner: number, provider: vscode.DocumentCommentProvider, vscodeCommentInfo: vscode.CommentInfo, commandsConverter: CommandsConverter): modes.CommentInfo {
215+
function convertCommentInfo(owner: number, extensionId: ExtensionIdentifier, provider: vscode.DocumentCommentProvider, vscodeCommentInfo: vscode.CommentInfo, commandsConverter: CommandsConverter): modes.CommentInfo {
203216
return {
204-
threads: vscodeCommentInfo.threads.map(x => convertToCommentThread(provider, x, commandsConverter)),
217+
extensionId: extensionId.value,
218+
threads: vscodeCommentInfo.threads.map(x => convertToCommentThread(extensionId, provider, x, commandsConverter)),
205219
commentingRanges: vscodeCommentInfo.commentingRanges ? vscodeCommentInfo.commentingRanges.map(range => extHostTypeConverter.Range.from(range)) : [],
206220
draftMode: provider.startDraft && provider.finishDraft ? (vscodeCommentInfo.inDraftMode ? modes.DraftMode.InDraft : modes.DraftMode.NotInDraft) : modes.DraftMode.NotSupported
207221
};
208222
}
209223

210-
function convertToCommentThread(provider: vscode.DocumentCommentProvider | vscode.WorkspaceCommentProvider, vscodeCommentThread: vscode.CommentThread, commandsConverter: CommandsConverter): modes.CommentThread {
224+
function convertToCommentThread(extensionId: ExtensionIdentifier, provider: vscode.DocumentCommentProvider | vscode.WorkspaceCommentProvider, vscodeCommentThread: vscode.CommentThread, commandsConverter: CommandsConverter): modes.CommentThread {
211225
return {
226+
extensionId: extensionId.value,
212227
threadId: vscodeCommentThread.threadId,
213228
resource: vscodeCommentThread.resource.toString(),
214229
range: extHostTypeConverter.Range.from(vscodeCommentThread.range),

src/vs/workbench/parts/comments/electron-browser/commentThreadWidget.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ export class ReviewZoneWidget extends ZoneWidget {
8080
return this._commentThread;
8181
}
8282

83+
public get extensionId(): string {
84+
return this._commentThread.extensionId;
85+
}
86+
8387
public get draftMode(): modes.DraftMode {
8488
return this._draftMode;
8589
}
@@ -305,7 +309,11 @@ export class ReviewZoneWidget extends ZoneWidget {
305309
this._commentForm = dom.append(this._bodyElement, dom.$('.comment-form'));
306310
this._commentEditor = this.instantiationService.createInstance(SimpleCommentEditor, this._commentForm, SimpleCommentEditor.getEditorOptions());
307311
const modeId = hasExistingComments ? this._commentThread.threadId : ++INMEM_MODEL_ID;
308-
const resource = URI.parse(`${COMMENT_SCHEME}:commentinput-${modeId}.md`);
312+
const params = JSON.stringify({
313+
extensionId: this.extensionId,
314+
commentThreadId: this.commentThread.threadId
315+
});
316+
const resource = URI.parse(`${COMMENT_SCHEME}:commentinput-${modeId}.md?${params}`);
309317
const model = this.modelService.createModel(this._pendingComment || '', this.modeService.createByFilepathOrFirstLine(resource.path), resource, false);
310318
this._localToDispose.push(model);
311319
this._commentEditor.setModel(model);

src/vs/workbench/parts/comments/electron-browser/commentsEditorContribution.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class CommentingRangeDecoration {
6464
return this._decorationId;
6565
}
6666

67-
constructor(private _editor: ICodeEditor, private _ownerId: string, private _range: IRange, private _reply: modes.Command, commentingOptions: ModelDecorationOptions) {
67+
constructor(private _editor: ICodeEditor, private _ownerId: string, private _extensionId: string, private _range: IRange, private _reply: modes.Command, commentingOptions: ModelDecorationOptions) {
6868
const startLineNumber = _range.startLineNumber;
6969
const endLineNumber = _range.endLineNumber;
7070
let commentingRangeDecorations = [{
@@ -81,8 +81,9 @@ class CommentingRangeDecoration {
8181
}
8282
}
8383

84-
public getCommentAction(): { replyCommand: modes.Command, ownerId: string } {
84+
public getCommentAction(): { replyCommand: modes.Command, ownerId: string, extensionId: string } {
8585
return {
86+
extensionId: this._extensionId,
8687
replyCommand: this._reply,
8788
ownerId: this._ownerId
8889
};
@@ -120,7 +121,7 @@ class CommentingRangeDecorator {
120121
let commentingRangeDecorations: CommentingRangeDecoration[] = [];
121122
for (const info of commentInfos) {
122123
info.commentingRanges.forEach(range => {
123-
commentingRangeDecorations.push(new CommentingRangeDecoration(editor, info.owner, range, info.reply, this.decorationOptions));
124+
commentingRangeDecorations.push(new CommentingRangeDecoration(editor, info.owner, info.extensionId, range, info.reply, this.decorationOptions));
124125
});
125126
}
126127

@@ -161,7 +162,7 @@ export class ReviewController implements IEditorContribution {
161162
private _computePromise: CancelablePromise<ICommentInfo[]> | null;
162163

163164
private _pendingCommentCache: { [key: number]: { [key: string]: string } };
164-
private _pendingNewCommentCache: { [key: string]: { lineNumber: number, replyCommand: modes.Command, ownerId: string, pendingComment: string, draftMode: modes.DraftMode } };
165+
private _pendingNewCommentCache: { [key: string]: { lineNumber: number, replyCommand: modes.Command, ownerId: string, extensionId: string, pendingComment: string, draftMode: modes.DraftMode } };
165166

166167
constructor(
167168
editor: ICodeEditor,
@@ -325,6 +326,7 @@ export class ReviewController implements IEditorContribution {
325326
this._pendingNewCommentCache[e.oldModelUrl.toString()] = {
326327
lineNumber: position.lineNumber,
327328
ownerId: this._newCommentWidget.owner,
329+
extensionId: this._newCommentWidget.extensionId,
328330
replyCommand: this._newCommentWidget.commentThread.reply,
329331
pendingComment: pendingNewComment,
330332
draftMode: this._newCommentWidget.draftMode
@@ -344,7 +346,7 @@ export class ReviewController implements IEditorContribution {
344346

345347
if (e.newModelUrl && this._pendingNewCommentCache[e.newModelUrl.toString()]) {
346348
let newCommentCache = this._pendingNewCommentCache[e.newModelUrl.toString()];
347-
this.addComment(newCommentCache.lineNumber, newCommentCache.replyCommand, newCommentCache.ownerId, newCommentCache.draftMode, newCommentCache.pendingComment);
349+
this.addComment(newCommentCache.lineNumber, newCommentCache.replyCommand, newCommentCache.ownerId, newCommentCache.extensionId, newCommentCache.draftMode, newCommentCache.pendingComment);
348350
}
349351

350352
this.localToDispose.push(this.editor.onMouseDown(e => this.onEditorMouseDown(e)));
@@ -402,7 +404,7 @@ export class ReviewController implements IEditorContribution {
402404
this.beginCompute();
403405
}
404406

405-
private addComment(lineNumber: number, replyCommand: modes.Command, ownerId: string, draftMode: modes.DraftMode, pendingComment: string) {
407+
private addComment(lineNumber: number, replyCommand: modes.Command, ownerId: string, extensionId: string, draftMode: modes.DraftMode, pendingComment: string) {
406408
if (this._newCommentWidget !== null) {
407409
this.notificationService.warn(`Please submit the comment at line ${this._newCommentWidget.position.lineNumber} before creating a new one.`);
408410
return;
@@ -411,6 +413,7 @@ export class ReviewController implements IEditorContribution {
411413
// add new comment
412414
this._reviewPanelVisible.set(true);
413415
this._newCommentWidget = new ReviewZoneWidget(this.instantiationService, this.modeService, this.modelService, this.themeService, this.commentService, this.openerService, this.dialogService, this.notificationService, this.editor, ownerId, {
416+
extensionId: extensionId,
414417
threadId: null,
415418
resource: null,
416419
comments: [],
@@ -502,7 +505,7 @@ export class ReviewController implements IEditorContribution {
502505
if (!newCommentInfo) {
503506
return;
504507
}
505-
const { replyCommand, ownerId } = newCommentInfo;
508+
const { replyCommand, ownerId, extensionId } = newCommentInfo;
506509

507510
let commentInfo = this._commentInfos.filter(info => info.owner === ownerId);
508511
if (!commentInfo || !commentInfo.length) {
@@ -511,7 +514,7 @@ export class ReviewController implements IEditorContribution {
511514

512515
let draftMode = commentInfo[0].draftMode;
513516

514-
this.addComment(lineNumber, replyCommand, ownerId, draftMode, null);
517+
this.addComment(lineNumber, replyCommand, ownerId, extensionId, draftMode, null);
515518
}
516519
}
517520

0 commit comments

Comments
 (0)