Skip to content

Commit 8446e3f

Browse files
committed
Strict null check more quick open files
1 parent 34dbc71 commit 8446e3f

6 files changed

Lines changed: 51 additions & 42 deletions

File tree

src/tsconfig.strictNullChecks.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@
155155
"./vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.ts",
156156
"./vs/editor/standalone/browser/inspectTokens/inspectTokens.ts",
157157
"./vs/editor/standalone/browser/quickOpen/editorQuickOpen.ts",
158+
"./vs/editor/standalone/browser/quickOpen/gotoLine.ts",
158159
"./vs/editor/standalone/browser/quickOpen/quickCommand.ts",
159160
"./vs/editor/standalone/browser/quickOpen/quickOpenEditorWidget.ts",
160161
"./vs/editor/standalone/browser/quickOpen/quickOutline.ts",
@@ -434,6 +435,7 @@
434435
"./vs/workbench/browser/parts/editor/breadcrumbsModel.ts",
435436
"./vs/workbench/browser/parts/editor/editor.ts",
436437
"./vs/workbench/browser/parts/editor/editorControl.ts",
438+
"./vs/workbench/browser/parts/editor/editorPicker.ts",
437439
"./vs/workbench/browser/parts/editor/editorWidgets.ts",
438440
"./vs/workbench/browser/parts/editor/rangeDecorations.ts",
439441
"./vs/workbench/browser/parts/editor/resourceViewer.ts",
@@ -567,6 +569,7 @@
567569
"./vs/workbench/parts/preferences/test/common/smartSnippetInserter.test.ts",
568570
"./vs/workbench/parts/quickopen/browser/commandsHandler.ts",
569571
"./vs/workbench/parts/quickopen/browser/gotoLineHandler.ts",
572+
"./vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts",
570573
"./vs/workbench/parts/quickopen/browser/helpHandler.ts",
571574
"./vs/workbench/parts/quickopen/browser/viewPickerHandler.ts",
572575
"./vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts",
@@ -575,6 +578,7 @@
575578
"./vs/workbench/parts/scm/electron-browser/scmActivity.ts",
576579
"./vs/workbench/parts/scm/electron-browser/scmMenus.ts",
577580
"./vs/workbench/parts/scm/electron-browser/scmUtil.ts",
581+
"./vs/workbench/parts/search/browser/openAnythingHandler.ts",
578582
"./vs/workbench/parts/search/browser/openFileHandler.ts",
579583
"./vs/workbench/parts/search/browser/openSymbolHandler.ts",
580584
"./vs/workbench/parts/search/browser/patternInputWidget.ts",

src/vs/editor/standalone/browser/quickOpen/gotoLine.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import 'vs/css!./gotoLine';
77
import * as nls from 'vs/nls';
88
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
9-
import { IContext, QuickOpenEntry, QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel';
10-
import { IAutoFocus, Mode } from 'vs/base/parts/quickopen/common/quickOpen';
9+
import { QuickOpenEntry, QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel';
10+
import { IAutoFocus, Mode, IEntryRunContext } from 'vs/base/parts/quickopen/common/quickOpen';
1111
import { ICodeEditor, IDiffEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser';
1212
import { ServicesAccessor, registerEditorAction } from 'vs/editor/browser/editorExtensions';
1313
import { Position } from 'vs/editor/common/core/position';
@@ -49,14 +49,15 @@ export class GotoLineEntry extends QuickOpenEntry {
4949
position = new Position(numbers[0], numbers[1]);
5050
}
5151

52-
let model: ITextModel;
52+
let model: ITextModel | null;
5353
if (isCodeEditor(this.editor)) {
5454
model = this.editor.getModel();
5555
} else {
56-
model = (<IDiffEditor>this.editor).getModel().modified;
56+
const diffModel = (<IDiffEditor>this.editor).getModel();
57+
model = diffModel ? diffModel.modified : null;
5758
}
5859

59-
const isValid = model.validatePosition(position).equals(position);
60+
const isValid = model ? model.validatePosition(position).equals(position) : false;
6061
let label: string;
6162

6263
if (isValid) {
@@ -65,10 +66,10 @@ export class GotoLineEntry extends QuickOpenEntry {
6566
} else {
6667
label = nls.localize('gotoLineLabelValidLine', "Go to line {0}", position.lineNumber, position.column);
6768
}
68-
} else if (position.lineNumber < 1 || position.lineNumber > model.getLineCount()) {
69-
label = nls.localize('gotoLineLabelEmptyWithLineLimit', "Type a line number between 1 and {0} to navigate to", model.getLineCount());
69+
} else if (position.lineNumber < 1 || position.lineNumber > (model ? model.getLineCount() : 0)) {
70+
label = nls.localize('gotoLineLabelEmptyWithLineLimit', "Type a line number between 1 and {0} to navigate to", model ? model.getLineCount() : 0);
7071
} else {
71-
label = nls.localize('gotoLineLabelEmptyWithLineAndColumnLimit', "Type a character between 1 and {0} to navigate to", model.getLineMaxColumn(position.lineNumber));
72+
label = nls.localize('gotoLineLabelEmptyWithLineAndColumnLimit', "Type a character between 1 and {0} to navigate to", model ? model.getLineMaxColumn(position.lineNumber) : 0);
7273
}
7374

7475
return {
@@ -83,12 +84,12 @@ export class GotoLineEntry extends QuickOpenEntry {
8384
}
8485

8586
getAriaLabel(): string {
86-
const currentLine = this.editor.getPosition().lineNumber;
87-
87+
const position = this.editor.getPosition();
88+
const currentLine = position ? position.lineNumber : 0;
8889
return nls.localize('gotoLineAriaLabel', "Current Line: {0}. Go to line {0}.", currentLine, this.parseResult.label);
8990
}
9091

91-
run(mode: Mode, context: IContext): boolean {
92+
run(mode: Mode, _context: IEntryRunContext): boolean {
9293
if (mode === Mode.OPEN) {
9394
return this.runOpen();
9495
}

src/vs/workbench/browser/parts/editor/editorPicker.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import 'vs/css!./media/editorpicker';
77
import * as nls from 'vs/nls';
8-
import { URI } from 'vs/base/common/uri';
98
import { IIconLabelValueOptions } from 'vs/base/browser/ui/iconLabel/iconLabel';
109
import { IAutoFocus, Mode, IEntryRunContext, IQuickNavigateConfiguration, IModel } from 'vs/base/parts/quickopen/common/quickOpen';
1110
import { QuickOpenModel, QuickOpenEntry, QuickOpenEntryGroup, QuickOpenItemAccessor } from 'vs/base/parts/quickopen/browser/quickOpenModel';
@@ -33,12 +32,12 @@ export class EditorPickerEntry extends QuickOpenEntryGroup {
3332

3433
getLabelOptions(): IIconLabelValueOptions {
3534
return {
36-
extraClasses: getIconClasses(this.modelService, this.modeService, this.getResource()),
35+
extraClasses: getIconClasses(this.modelService, this.modeService, this.getResource() || undefined),
3736
italic: !this._group.isPinned(this.editor)
3837
};
3938
}
4039

41-
getLabel(): string {
40+
getLabel() {
4241
return this.editor.getName();
4342
}
4443

@@ -50,15 +49,15 @@ export class EditorPickerEntry extends QuickOpenEntryGroup {
5049
return this._group;
5150
}
5251

53-
getResource(): URI {
52+
getResource() {
5453
return toResource(this.editor, { supportSideBySide: true });
5554
}
5655

5756
getAriaLabel(): string {
5857
return nls.localize('entryAriaLabel', "{0}, editor group picker", this.getLabel());
5958
}
6059

61-
getDescription(): string {
60+
getDescription() {
6261
return this.editor.getDescription();
6362
}
6463

@@ -109,7 +108,7 @@ export abstract class BaseEditorPicker extends QuickOpenHandler {
109108
return false;
110109
}
111110

112-
e.setHighlights(itemScore.labelMatch, itemScore.descriptionMatch);
111+
e.setHighlights(itemScore.labelMatch || [], itemScore.descriptionMatch);
113112

114113
return true;
115114
});

src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class OutlineModel extends QuickOpenModel {
128128

129129
// Update previous result with count
130130
if (currentResult) {
131-
currentResult.setGroupLabel(this.renderGroupLabel(currentType, typeCounter));
131+
currentResult.setGroupLabel(typeof currentType === 'number' ? this.renderGroupLabel(currentType, typeCounter) : undefined);
132132
}
133133

134134
currentType = result.getKind();
@@ -146,7 +146,7 @@ class OutlineModel extends QuickOpenModel {
146146

147147
// Update previous result with count
148148
if (currentResult) {
149-
currentResult.setGroupLabel(this.renderGroupLabel(currentType, typeCounter));
149+
currentResult.setGroupLabel(typeof currentType === 'number' ? this.renderGroupLabel(currentType, typeCounter) : undefined);
150150
}
151151
}
152152

@@ -338,7 +338,7 @@ class SymbolEntry extends EditorQuickOpenEntryGroup {
338338

339339
// Decorate if possible
340340
if (types.isFunction(activeTextEditorWidget.changeDecorations)) {
341-
this.handler.decorateOutline(this.range, range, activeTextEditorWidget, this.editorService.activeControl.group);
341+
this.handler.decorateOutline(this.range, range, activeTextEditorWidget, this.editorService.activeControl.group!);
342342
}
343343
}
344344

@@ -365,11 +365,11 @@ export class GotoSymbolHandler extends QuickOpenHandler {
365365

366366
static readonly ID = 'workbench.picker.filesymbols';
367367

368-
private rangeHighlightDecorationId: IEditorLineDecoration;
369-
private lastKnownEditorViewState: IEditorViewState;
368+
private rangeHighlightDecorationId?: IEditorLineDecoration;
369+
private lastKnownEditorViewState: IEditorViewState | null;
370370

371-
private cachedOutlineRequest: Promise<OutlineModel>;
372-
private pendingOutlineRequest: CancellationTokenSource;
371+
private cachedOutlineRequest?: Promise<OutlineModel | null>;
372+
private pendingOutlineRequest?: CancellationTokenSource;
373373

374374
constructor(
375375
@IEditorService private readonly editorService: IEditorService
@@ -386,11 +386,11 @@ export class GotoSymbolHandler extends QuickOpenHandler {
386386
private onDidActiveEditorChange(): void {
387387
this.clearOutlineRequest();
388388

389-
this.lastKnownEditorViewState = undefined;
389+
this.lastKnownEditorViewState = null;
390390
this.rangeHighlightDecorationId = undefined;
391391
}
392392

393-
getResults(searchValue: string, token: CancellationToken): Promise<QuickOpenModel> {
393+
getResults(searchValue: string, token: CancellationToken): Promise<QuickOpenModel | null> {
394394
searchValue = searchValue.trim();
395395

396396
// Support to cancel pending outline requests
@@ -406,6 +406,10 @@ export class GotoSymbolHandler extends QuickOpenHandler {
406406

407407
// Resolve Outline Model
408408
return this.getOutline().then(outline => {
409+
if (!outline) {
410+
return outline;
411+
}
412+
409413
if (token.isCancellationRequested) {
410414
return outline;
411415
}
@@ -469,20 +473,20 @@ export class GotoSymbolHandler extends QuickOpenHandler {
469473
const label = strings.trim(element.name);
470474

471475
// Show parent scope as description
472-
const description: string = element.containerName;
476+
const description = element.containerName || '';
473477
const icon = symbolKindToCssClass(element.kind);
474478

475479
// Add
476480
results.push(new SymbolEntry(i,
477481
label, element.kind, description, `symbol-icon ${icon}`,
478-
element.range, element.selectionRange, null, this.editorService, this
482+
element.range, element.selectionRange, [], this.editorService, this
479483
));
480484
}
481485

482486
return results;
483487
}
484488

485-
private getOutline(): Promise<OutlineModel> {
489+
private getOutline(): Promise<OutlineModel | null> {
486490
if (!this.cachedOutlineRequest) {
487491
this.cachedOutlineRequest = this.doGetActiveOutline();
488492
}
@@ -499,7 +503,7 @@ export class GotoSymbolHandler extends QuickOpenHandler {
499503
}
500504

501505
if (model && types.isFunction((<ITextModel>model).getLanguageIdentifier)) {
502-
return Promise.resolve(asPromise(() => getDocumentSymbols(<ITextModel>model, true, this.pendingOutlineRequest.token)).then(entries => {
506+
return Promise.resolve(asPromise(() => getDocumentSymbols(<ITextModel>model, true, this.pendingOutlineRequest!.token)).then(entries => {
503507
return new OutlineModel(this.toQuickOpenEntries(entries));
504508
}));
505509
}
@@ -515,7 +519,7 @@ export class GotoSymbolHandler extends QuickOpenHandler {
515519
if (this.rangeHighlightDecorationId) {
516520
deleteDecorations.push(this.rangeHighlightDecorationId.lineDecorationId);
517521
deleteDecorations.push(this.rangeHighlightDecorationId.rangeHighlightId);
518-
this.rangeHighlightDecorationId = null;
522+
this.rangeHighlightDecorationId = undefined;
519523
}
520524

521525
const newDecorations: IModelDeltaDecoration[] = [
@@ -555,20 +559,21 @@ export class GotoSymbolHandler extends QuickOpenHandler {
555559
}
556560

557561
private clearDecorations(): void {
558-
if (this.rangeHighlightDecorationId) {
562+
const rangeHighlightDecorationId = this.rangeHighlightDecorationId;
563+
if (rangeHighlightDecorationId) {
559564
this.editorService.visibleControls.forEach(editor => {
560-
if (editor.group.id === this.rangeHighlightDecorationId.groupId) {
565+
if (editor.group && editor.group.id === rangeHighlightDecorationId.groupId) {
561566
const editorControl = <IEditor>editor.getControl();
562567
editorControl.changeDecorations((changeAccessor: IModelDecorationsChangeAccessor) => {
563568
changeAccessor.deltaDecorations([
564-
this.rangeHighlightDecorationId.lineDecorationId,
565-
this.rangeHighlightDecorationId.rangeHighlightId
569+
rangeHighlightDecorationId.lineDecorationId,
570+
rangeHighlightDecorationId.rangeHighlightId
566571
], []);
567572
});
568573
}
569574
});
570575

571-
this.rangeHighlightDecorationId = null;
576+
this.rangeHighlightDecorationId = undefined;
572577
}
573578
}
574579

@@ -598,6 +603,6 @@ export class GotoSymbolHandler extends QuickOpenHandler {
598603
this.pendingOutlineRequest = undefined;
599604
}
600605

601-
this.cachedOutlineRequest = null;
606+
this.cachedOutlineRequest = undefined;
602607
}
603608
}

src/vs/workbench/parts/search/browser/openAnythingHandler.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ export class OpenAnythingHandler extends QuickOpenHandler {
132132
entry.setRange(searchWithRange ? searchWithRange.range : null);
133133

134134
const itemScore = scoreItem(entry, query, true, QuickOpenItemAccessor, this.scorerCache);
135-
entry.setHighlights(itemScore.labelMatch, itemScore.descriptionMatch);
135+
entry.setHighlights(itemScore.labelMatch || [], itemScore.descriptionMatch);
136136
}
137137
});
138138

@@ -165,7 +165,7 @@ export class OpenAnythingHandler extends QuickOpenHandler {
165165
return this.openFileHandler.hasShortResponseTime() && this.openSymbolHandler.hasShortResponseTime();
166166
}
167167

168-
private extractRange(value: string): ISearchWithRange {
168+
private extractRange(value: string): ISearchWithRange | null {
169169
if (!value) {
170170
return null;
171171
}
@@ -211,7 +211,7 @@ export class OpenAnythingHandler extends QuickOpenHandler {
211211
}
212212
}
213213

214-
if (range) {
214+
if (patternMatch && range) {
215215
return {
216216
search: value.substr(0, patternMatch.index), // clear range suffix from search value
217217
range: range

src/vs/workbench/parts/search/browser/openFileHandler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export class FileQuickOpenModel extends QuickOpenModel {
4343
}
4444

4545
export class FileEntry extends EditorQuickOpenEntry {
46-
private range: IRange;
46+
private range: IRange | null;
4747

4848
constructor(
4949
private resource: URI,
@@ -85,7 +85,7 @@ export class FileEntry extends EditorQuickOpenEntry {
8585
return this.resource;
8686
}
8787

88-
setRange(range: IRange): void {
88+
setRange(range: IRange | null): void {
8989
this.range = range;
9090
}
9191

0 commit comments

Comments
 (0)