Skip to content

Commit f1afe72

Browse files
committed
Add getDocument helper method
Many places in `extHostLanguageFeatures` were calling `getDocumentData` without checking if the result is undefined. Add an `getDocument` that cannot return undefined values and instead throws an error if there is no document
1 parent 9ee6077 commit f1afe72

3 files changed

Lines changed: 46 additions & 77 deletions

File tree

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

Lines changed: 16 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -111,107 +111,68 @@ export class ExtHostComments implements ExtHostCommentsShape {
111111
}
112112

113113
$editComment(handle: number, uri: UriComponents, comment: modes.Comment, text: string): Promise<void> {
114-
const data = this._documents.getDocumentData(URI.revive(uri));
115-
116-
if (!data || !data.document) {
117-
throw new Error('Unable to retrieve document from URI');
118-
}
119-
114+
const document = this._documents.getDocument(URI.revive(uri));
120115
const handlerData = this._documentProviders.get(handle);
121116
return asPromise(() => {
122-
return handlerData.provider.editComment(data.document, convertFromComment(comment), text, CancellationToken.None);
117+
return handlerData.provider.editComment(document, convertFromComment(comment), text, CancellationToken.None);
123118
});
124119
}
125120

126121
$deleteComment(handle: number, uri: UriComponents, comment: modes.Comment): Promise<void> {
127-
const data = this._documents.getDocumentData(URI.revive(uri));
128-
129-
if (!data || !data.document) {
130-
throw new Error('Unable to retrieve document from URI');
131-
}
132-
122+
const document = this._documents.getDocument(URI.revive(uri));
133123
const handlerData = this._documentProviders.get(handle);
134124
return asPromise(() => {
135-
return handlerData.provider.deleteComment(data.document, convertFromComment(comment), CancellationToken.None);
125+
return handlerData.provider.deleteComment(document, convertFromComment(comment), CancellationToken.None);
136126
});
137127
}
138128

139129
$startDraft(handle: number, uri: UriComponents): Promise<void> {
140-
const data = this._documents.getDocumentData(URI.revive(uri));
141-
142-
if (!data || !data.document) {
143-
throw new Error('Unable to retrieve document from URI');
144-
}
130+
const document = this._documents.getDocument(URI.revive(uri));
145131

146132
const handlerData = this._documentProviders.get(handle);
147133
return asPromise(() => {
148-
return handlerData.provider.startDraft(data.document, CancellationToken.None);
134+
return handlerData.provider.startDraft(document, CancellationToken.None);
149135
});
150136
}
151137

152138
$deleteDraft(handle: number, uri: UriComponents): Promise<void> {
153-
const data = this._documents.getDocumentData(URI.revive(uri));
154-
155-
if (!data || !data.document) {
156-
throw new Error('Unable to retrieve document from URI');
157-
}
158-
139+
const document = this._documents.getDocument(URI.revive(uri));
159140
const handlerData = this._documentProviders.get(handle);
160141
return asPromise(() => {
161-
return handlerData.provider.deleteDraft(data.document, CancellationToken.None);
142+
return handlerData.provider.deleteDraft(document, CancellationToken.None);
162143
});
163144
}
164145

165146
$finishDraft(handle: number, uri: UriComponents): Promise<void> {
166-
const data = this._documents.getDocumentData(URI.revive(uri));
167-
168-
if (!data || !data.document) {
169-
throw new Error('Unable to retrieve document from URI');
170-
}
171-
147+
const document = this._documents.getDocument(URI.revive(uri));
172148
const handlerData = this._documentProviders.get(handle);
173149
return asPromise(() => {
174-
return handlerData.provider.finishDraft(data.document, CancellationToken.None);
150+
return handlerData.provider.finishDraft(document, CancellationToken.None);
175151
});
176152
}
177153

178154
$addReaction(handle: number, uri: UriComponents, comment: modes.Comment, reaction: modes.CommentReaction): Promise<void> {
179-
const data = this._documents.getDocumentData(URI.revive(uri));
180-
181-
if (!data || !data.document) {
182-
throw new Error('Unable to retrieve document from URI');
183-
}
184-
155+
const document = this._documents.getDocument(URI.revive(uri));
185156
const handlerData = this._documentProviders.get(handle);
186157

187158
return asPromise(() => {
188-
return handlerData.provider.addReaction(data.document, convertFromComment(comment), reaction);
159+
return handlerData.provider.addReaction(document, convertFromComment(comment), reaction);
189160
});
190161
}
191162

192163
$deleteReaction(handle: number, uri: UriComponents, comment: modes.Comment, reaction: modes.CommentReaction): Promise<void> {
193-
const data = this._documents.getDocumentData(URI.revive(uri));
194-
195-
if (!data || !data.document) {
196-
throw new Error('Unable to retrieve document from URI');
197-
}
198-
164+
const document = this._documents.getDocument(URI.revive(uri));
199165
const handlerData = this._documentProviders.get(handle);
200-
201166
return asPromise(() => {
202-
return handlerData.provider.deleteReaction(data.document, convertFromComment(comment), reaction);
167+
return handlerData.provider.deleteReaction(document, convertFromComment(comment), reaction);
203168
});
204169
}
205170

206171
$provideDocumentComments(handle: number, uri: UriComponents): Promise<modes.CommentInfo> {
207-
const data = this._documents.getDocumentData(URI.revive(uri));
208-
if (!data || !data.document) {
209-
return Promise.resolve(null);
210-
}
211-
172+
const document = this._documents.getDocument(URI.revive(uri));
212173
const handlerData = this._documentProviders.get(handle);
213174
return asPromise(() => {
214-
return handlerData.provider.provideDocumentComments(data.document, CancellationToken.None);
175+
return handlerData.provider.provideDocumentComments(document, CancellationToken.None);
215176
}).then(commentInfo => commentInfo ? convertCommentInfo(handle, handlerData.extensionId, handlerData.provider, commentInfo, this._commandsConverter) : null);
216177
}
217178

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ export class ExtHostDocuments implements ExtHostDocumentsShape {
6767
return undefined;
6868
}
6969

70+
public getDocument(resource: vscode.Uri): vscode.TextDocument {
71+
const data = this.getDocumentData(resource);
72+
if (!data || !data.document) {
73+
throw new Error('Unable to retrieve document from URI');
74+
}
75+
return data.document;
76+
}
77+
7078
public ensureDocumentData(uri: URI): Promise<ExtHostDocumentData> {
7179

7280
let cached = this._documentsAndEditors.getDocument(uri.toString());

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

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class DocumentSymbolAdapter {
4040
}
4141

4242
provideDocumentSymbols(resource: URI, token: CancellationToken): Promise<modes.DocumentSymbol[]> {
43-
let doc = this._documents.getDocumentData(resource).document;
43+
const doc = this._documents.getDocument(resource);
4444
return asPromise(() => this._provider.provideDocumentSymbols(doc, token)).then(value => {
4545
if (isFalsyOrEmpty(value)) {
4646
return undefined;
@@ -105,7 +105,7 @@ class CodeLensAdapter {
105105
) { }
106106

107107
provideCodeLenses(resource: URI, token: CancellationToken): Promise<CodeLensDto[]> {
108-
const doc = this._documents.getDocumentData(resource).document;
108+
const doc = this._documents.getDocument(resource);
109109

110110
return asPromise(() => this._provider.provideCodeLenses(doc, token)).then(lenses => {
111111
let result: CodeLensDto[] = [];
@@ -161,7 +161,7 @@ class DefinitionAdapter {
161161
) { }
162162

163163
provideDefinition(resource: URI, position: IPosition, token: CancellationToken): Promise<modes.LocationLink[]> {
164-
let doc = this._documents.getDocumentData(resource).document;
164+
const doc = this._documents.getDocument(resource);
165165
let pos = typeConvert.Position.to(position);
166166
return asPromise(() => this._provider.provideDefinition(doc, pos, token)).then(convertToLocationLinks);
167167
}
@@ -175,7 +175,7 @@ class DeclarationAdapter {
175175
) { }
176176

177177
provideDeclaration(resource: URI, position: IPosition, token: CancellationToken): Promise<modes.LocationLink[]> {
178-
let doc = this._documents.getDocumentData(resource).document;
178+
const doc = this._documents.getDocument(resource);
179179
let pos = typeConvert.Position.to(position);
180180
return asPromise(() => this._provider.provideDeclaration(doc, pos, token)).then(convertToLocationLinks);
181181
}
@@ -189,7 +189,7 @@ class ImplementationAdapter {
189189
) { }
190190

191191
provideImplementation(resource: URI, position: IPosition, token: CancellationToken): Promise<modes.LocationLink[]> {
192-
let doc = this._documents.getDocumentData(resource).document;
192+
const doc = this._documents.getDocument(resource);
193193
let pos = typeConvert.Position.to(position);
194194
return asPromise(() => this._provider.provideImplementation(doc, pos, token)).then(convertToLocationLinks);
195195
}
@@ -203,7 +203,7 @@ class TypeDefinitionAdapter {
203203
) { }
204204

205205
provideTypeDefinition(resource: URI, position: IPosition, token: CancellationToken): Promise<modes.LocationLink[]> {
206-
const doc = this._documents.getDocumentData(resource).document;
206+
const doc = this._documents.getDocument(resource);
207207
const pos = typeConvert.Position.to(position);
208208
return asPromise(() => this._provider.provideTypeDefinition(doc, pos, token)).then(convertToLocationLinks);
209209
}
@@ -218,7 +218,7 @@ class HoverAdapter {
218218

219219
public provideHover(resource: URI, position: IPosition, token: CancellationToken): Promise<modes.Hover> {
220220

221-
let doc = this._documents.getDocumentData(resource).document;
221+
const doc = this._documents.getDocument(resource);
222222
let pos = typeConvert.Position.to(position);
223223

224224
return asPromise(() => this._provider.provideHover(doc, pos, token)).then(value => {
@@ -246,7 +246,7 @@ class DocumentHighlightAdapter {
246246

247247
provideDocumentHighlights(resource: URI, position: IPosition, token: CancellationToken): Promise<modes.DocumentHighlight[]> {
248248

249-
let doc = this._documents.getDocumentData(resource).document;
249+
const doc = this._documents.getDocument(resource);
250250
let pos = typeConvert.Position.to(position);
251251

252252
return asPromise(() => this._provider.provideDocumentHighlights(doc, pos, token)).then(value => {
@@ -266,7 +266,7 @@ class ReferenceAdapter {
266266
) { }
267267

268268
provideReferences(resource: URI, position: IPosition, context: modes.ReferenceContext, token: CancellationToken): Promise<modes.Location[]> {
269-
let doc = this._documents.getDocumentData(resource).document;
269+
const doc = this._documents.getDocument(resource);
270270
let pos = typeConvert.Position.to(position);
271271

272272
return asPromise(() => this._provider.provideReferences(doc, pos, context, token)).then(value => {
@@ -296,7 +296,7 @@ class CodeActionAdapter {
296296

297297
provideCodeActions(resource: URI, rangeOrSelection: IRange | ISelection, context: modes.CodeActionContext, token: CancellationToken): Promise<CodeActionDto[]> {
298298

299-
const doc = this._documents.getDocumentData(resource).document;
299+
const doc = this._documents.getDocument(resource);
300300
const ran = Selection.isISelection(rangeOrSelection)
301301
? <vscode.Selection>typeConvert.Selection.to(rangeOrSelection)
302302
: <vscode.Range>typeConvert.Range.to(rangeOrSelection);
@@ -371,7 +371,7 @@ class DocumentFormattingAdapter {
371371

372372
provideDocumentFormattingEdits(resource: URI, options: modes.FormattingOptions, token: CancellationToken): Promise<ISingleEditOperation[]> {
373373

374-
const { document } = this._documents.getDocumentData(resource);
374+
const document = this._documents.getDocument(resource);
375375

376376
return asPromise(() => this._provider.provideDocumentFormattingEdits(document, <any>options, token)).then(value => {
377377
if (Array.isArray(value)) {
@@ -391,7 +391,7 @@ class RangeFormattingAdapter {
391391

392392
provideDocumentRangeFormattingEdits(resource: URI, range: IRange, options: modes.FormattingOptions, token: CancellationToken): Promise<ISingleEditOperation[]> {
393393

394-
const { document } = this._documents.getDocumentData(resource);
394+
const document = this._documents.getDocument(resource);
395395
const ran = typeConvert.Range.to(range);
396396

397397
return asPromise(() => this._provider.provideDocumentRangeFormattingEdits(document, ran, <any>options, token)).then(value => {
@@ -414,7 +414,7 @@ class OnTypeFormattingAdapter {
414414

415415
provideOnTypeFormattingEdits(resource: URI, position: IPosition, ch: string, options: modes.FormattingOptions, token: CancellationToken): Promise<ISingleEditOperation[]> {
416416

417-
const { document } = this._documents.getDocumentData(resource);
417+
const document = this._documents.getDocument(resource);
418418
const pos = typeConvert.Position.to(position);
419419

420420
return asPromise(() => this._provider.provideOnTypeFormattingEdits(document, pos, ch, <any>options, token)).then(value => {
@@ -501,7 +501,7 @@ class RenameAdapter {
501501

502502
provideRenameEdits(resource: URI, position: IPosition, newName: string, token: CancellationToken): Promise<WorkspaceEditDto | undefined> {
503503

504-
let doc = this._documents.getDocumentData(resource).document;
504+
const doc = this._documents.getDocument(resource);
505505
let pos = typeConvert.Position.to(position);
506506

507507
return asPromise(() => this._provider.provideRenameEdits(doc, pos, newName, token)).then(value => {
@@ -525,7 +525,7 @@ class RenameAdapter {
525525
return Promise.resolve(undefined);
526526
}
527527

528-
let doc = this._documents.getDocumentData(resource).document;
528+
const doc = this._documents.getDocument(resource);
529529
let pos = typeConvert.Position.to(position);
530530

531531
return asPromise(() => this._provider.prepareRename(doc, pos, token)).then(rangeOrLocation => {
@@ -591,7 +591,7 @@ class SuggestAdapter {
591591

592592
provideCompletionItems(resource: URI, position: IPosition, context: modes.CompletionContext, token: CancellationToken): Promise<SuggestResultDto> {
593593

594-
const doc = this._documents.getDocumentData(resource).document;
594+
const doc = this._documents.getDocument(resource);
595595
const pos = typeConvert.Position.to(position);
596596

597597
return asPromise<vscode.CompletionItem[] | vscode.CompletionList>(
@@ -654,7 +654,7 @@ class SuggestAdapter {
654654
return suggestion;
655655
}
656656

657-
const doc = this._documents.getDocumentData(resource).document;
657+
const doc = this._documents.getDocument(resource);
658658
const pos = typeConvert.Position.to(position);
659659
const wordRangeBeforePos = (doc.getWordRangeAtPosition(pos) as Range || new Range(pos, pos)).with({ end: pos });
660660
const newSuggestion = this._convertCompletionItem(resolvedItem, pos, wordRangeBeforePos, _id, _parentId);
@@ -741,7 +741,7 @@ class SignatureHelpAdapter {
741741
) { }
742742

743743
provideSignatureHelp(resource: URI, position: IPosition, context: modes.SignatureHelpContext, token: CancellationToken): Promise<modes.SignatureHelp> {
744-
const doc = this._documents.getDocumentData(resource).document;
744+
const doc = this._documents.getDocument(resource);
745745
const pos = typeConvert.Position.to(position);
746746
const vscodeContext = this.reviveContext(context);
747747

@@ -780,7 +780,7 @@ class LinkProviderAdapter {
780780
) { }
781781

782782
provideLinks(resource: URI, token: CancellationToken): Promise<LinkDto[]> {
783-
const doc = this._documents.getDocumentData(resource).document;
783+
const doc = this._documents.getDocument(resource);
784784

785785
return asPromise(() => this._provider.provideDocumentLinks(doc, token)).then(links => {
786786
if (!Array.isArray(links)) {
@@ -824,7 +824,7 @@ class ColorProviderAdapter {
824824
) { }
825825

826826
provideColors(resource: URI, token: CancellationToken): Promise<IRawColorInfo[]> {
827-
const doc = this._documents.getDocumentData(resource).document;
827+
const doc = this._documents.getDocument(resource);
828828
return asPromise(() => this._provider.provideDocumentColors(doc, token)).then(colors => {
829829
if (!Array.isArray(colors)) {
830830
return [];
@@ -842,7 +842,7 @@ class ColorProviderAdapter {
842842
}
843843

844844
provideColorPresentations(resource: URI, raw: IRawColorInfo, token: CancellationToken): Promise<modes.IColorPresentation[]> {
845-
const document = this._documents.getDocumentData(resource).document;
845+
const document = this._documents.getDocument(resource);
846846
const range = typeConvert.Range.to(raw.range);
847847
const color = typeConvert.Color.to(raw.color);
848848
return asPromise(() => this._provider.provideColorPresentations(color, { document, range }, token)).then(value => {
@@ -859,7 +859,7 @@ class FoldingProviderAdapter {
859859
) { }
860860

861861
provideFoldingRanges(resource: URI, context: modes.FoldingContext, token: CancellationToken): Promise<modes.FoldingRange[]> {
862-
const doc = this._documents.getDocumentData(resource).document;
862+
const doc = this._documents.getDocument(resource);
863863
return asPromise(() => this._provider.provideFoldingRanges(doc, context, token)).then(ranges => {
864864
if (!Array.isArray(ranges)) {
865865
return undefined;

0 commit comments

Comments
 (0)