Skip to content

Commit 026df27

Browse files
committed
lines operations strict null check.
microsoft#60565.
1 parent 914c6d9 commit 026df27

File tree

4 files changed

+89
-14
lines changed

4 files changed

+89
-14
lines changed

src/tsconfig.strictNullChecks.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@
337337
"./vs/editor/contrib/linesOperations/deleteLinesCommand.ts",
338338
"./vs/editor/contrib/linesOperations/moveLinesCommand.ts",
339339
"./vs/editor/contrib/linesOperations/sortLinesCommand.ts",
340+
"./vs/editor/contrib/linesOperations/linesOperations.ts",
340341
"./vs/editor/contrib/links/getLinks.ts",
341342
"./vs/editor/contrib/links/links.ts",
342343
"./vs/editor/contrib/markdown/markdownRenderer.ts",

src/vs/editor/common/controller/cursorTypeOperations.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ import { IElectricAction } from 'vs/editor/common/modes/supports/electricCharact
2121

2222
export class TypeOperations {
2323

24-
public static indent(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[]): ICommand[] {
24+
public static indent(config: CursorConfiguration, model: ICursorSimpleModel | null, selections: Selection[] | null): ICommand[] {
25+
if (model === null || selections === null) {
26+
return [];
27+
}
28+
2529
let commands: ICommand[] = [];
2630
for (let i = 0, len = selections.length; i < len; i++) {
2731
commands[i] = new ShiftCommand(selections[i], {
@@ -885,7 +889,11 @@ export class TypeOperations {
885889
});
886890
}
887891

888-
public static lineInsertBefore(config: CursorConfiguration, model: ITextModel, selections: Selection[]): ICommand[] {
892+
public static lineInsertBefore(config: CursorConfiguration, model: ITextModel | null, selections: Selection[] | null): ICommand[] {
893+
if (model === null || selections === null) {
894+
return [];
895+
}
896+
889897
let commands: ICommand[] = [];
890898
for (let i = 0, len = selections.length; i < len; i++) {
891899
let lineNumber = selections[i].positionLineNumber;
@@ -902,7 +910,11 @@ export class TypeOperations {
902910
return commands;
903911
}
904912

905-
public static lineInsertAfter(config: CursorConfiguration, model: ITextModel, selections: Selection[]): ICommand[] {
913+
public static lineInsertAfter(config: CursorConfiguration, model: ITextModel | null, selections: Selection[] | null): ICommand[] {
914+
if (model === null || selections === null) {
915+
return [];
916+
}
917+
906918
let commands: ICommand[] = [];
907919
for (let i = 0, len = selections.length; i < len; i++) {
908920
const lineNumber = selections[i].positionLineNumber;

src/vs/editor/contrib/linesOperations/linesOperations.ts

Lines changed: 68 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,12 @@ export class TrimTrailingWhitespaceAction extends EditorAction {
249249
cursors = (editor.getSelections() || []).map(s => new Position(s.positionLineNumber, s.positionColumn));
250250
}
251251

252-
let command = new TrimTrailingWhitespaceCommand(editor.getSelection(), cursors);
252+
let selection = editor.getSelection();
253+
if (selection === null) {
254+
return;
255+
}
256+
257+
let command = new TrimTrailingWhitespaceCommand(selection, cursors);
253258

254259
editor.pushUndoStop();
255260
editor.executeCommands(this.id, [command]);
@@ -297,7 +302,11 @@ class DeleteLinesAction extends EditorAction {
297302

298303
private _getLinesToRemove(editor: ICodeEditor): IDeleteLinesOperation[] {
299304
// Construct delete operations
300-
let operations: IDeleteLinesOperation[] = editor.getSelections().map((s) => {
305+
let selections = editor.getSelections();
306+
if (selections === null) {
307+
return [];
308+
}
309+
let operations: IDeleteLinesOperation[] = selections.map((s) => {
301310

302311
let endLineNumber = s.endLineNumber;
303312
if (s.startLineNumber < s.endLineNumber && s.endColumn === 1) {
@@ -378,7 +387,7 @@ class OutdentLinesAction extends EditorAction {
378387
}
379388

380389
public run(_accessor: ServicesAccessor, editor: ICodeEditor): void {
381-
CoreEditingCommands.Outdent.runEditorCommand(null, editor, null);
390+
CoreEditingCommands.Outdent.runEditorCommand(_accessor, editor, null);
382391
}
383392
}
384393

@@ -435,6 +444,10 @@ export class InsertLineAfterAction extends EditorAction {
435444
export abstract class AbstractDeleteAllToBoundaryAction extends EditorAction {
436445
public run(_accessor: ServicesAccessor, editor: ICodeEditor): void {
437446
const primaryCursor = editor.getSelection();
447+
if (primaryCursor === null) {
448+
return;
449+
}
450+
438451
let rangesToDelete = this._getRangesToDelete(editor);
439452
// merge overlapping selections
440453
let effectiveRanges: Range[] = [];
@@ -488,7 +501,7 @@ export class DeleteAllLeftAction extends AbstractDeleteAllToBoundaryAction {
488501
}
489502

490503
_getEndCursorState(primaryCursor: Range, rangesToDelete: Range[]): Selection[] {
491-
let endPrimaryCursor: Selection;
504+
let endPrimaryCursor: Selection | null = null;
492505
let endCursorState: Selection[] = [];
493506
let deletedLines = 0;
494507

@@ -518,15 +531,24 @@ export class DeleteAllLeftAction extends AbstractDeleteAllToBoundaryAction {
518531
}
519532

520533
_getRangesToDelete(editor: ICodeEditor): Range[] {
521-
let rangesToDelete: Range[] = editor.getSelections();
534+
let selections = editor.getSelections();
535+
if (selections === null) {
536+
return [];
537+
}
538+
539+
let rangesToDelete: Range[] = selections;
522540
let model = editor.getModel();
523541

542+
if (model === null) {
543+
return [];
544+
}
545+
524546
rangesToDelete.sort(Range.compareRangesUsingStarts);
525547
rangesToDelete = rangesToDelete.map(selection => {
526548
if (selection.isEmpty()) {
527549
if (selection.startColumn === 1) {
528550
let deleteFromLine = Math.max(1, selection.startLineNumber - 1);
529-
let deleteFromColumn = selection.startLineNumber === 1 ? 1 : model.getLineContent(deleteFromLine).length + 1;
551+
let deleteFromColumn = selection.startLineNumber === 1 ? 1 : model!.getLineContent(deleteFromLine).length + 1;
530552
return new Range(deleteFromLine, deleteFromColumn, selection.startLineNumber, 1);
531553
} else {
532554
return new Range(selection.startLineNumber, 1, selection.startLineNumber, selection.startColumn);
@@ -557,7 +579,7 @@ export class DeleteAllRightAction extends AbstractDeleteAllToBoundaryAction {
557579
}
558580

559581
_getEndCursorState(primaryCursor: Range, rangesToDelete: Range[]): Selection[] {
560-
let endPrimaryCursor: Selection;
582+
let endPrimaryCursor: Selection | null = null;
561583
let endCursorState: Selection[] = [];
562584
for (let i = 0, len = rangesToDelete.length, offset = 0; i < len; i++) {
563585
let range = rangesToDelete[i];
@@ -579,10 +601,19 @@ export class DeleteAllRightAction extends AbstractDeleteAllToBoundaryAction {
579601

580602
_getRangesToDelete(editor: ICodeEditor): Range[] {
581603
let model = editor.getModel();
604+
if (model === null) {
605+
return [];
606+
}
582607

583-
let rangesToDelete: Range[] = editor.getSelections().map((sel) => {
608+
let selections = editor.getSelections();
609+
610+
if (selections === null) {
611+
return [];
612+
}
613+
614+
let rangesToDelete: Range[] = selections.map((sel) => {
584615
if (sel.isEmpty()) {
585-
const maxColumn = model.getLineMaxColumn(sel.startLineNumber);
616+
const maxColumn = model!.getLineMaxColumn(sel.startLineNumber);
586617

587618
if (sel.startColumn === maxColumn) {
588619
return new Range(sel.startLineNumber, sel.startColumn, sel.startLineNumber + 1, 1);
@@ -616,15 +647,22 @@ export class JoinLinesAction extends EditorAction {
616647

617648
public run(_accessor: ServicesAccessor, editor: ICodeEditor): void {
618649
let selections = editor.getSelections();
650+
if (selections === null) {
651+
return;
652+
}
653+
619654
let primaryCursor = editor.getSelection();
655+
if (primaryCursor === null) {
656+
return;
657+
}
620658

621659
selections.sort(Range.compareRangesUsingStarts);
622660
let reducedSelections: Selection[] = [];
623661

624662
let lastSelection = selections.reduce((previousValue, currentValue) => {
625663
if (previousValue.isEmpty()) {
626664
if (previousValue.endLineNumber === currentValue.startLineNumber) {
627-
if (primaryCursor.equalsSelection(previousValue)) {
665+
if (primaryCursor!.equalsSelection(previousValue)) {
628666
primaryCursor = currentValue;
629667
}
630668
return currentValue;
@@ -649,6 +687,10 @@ export class JoinLinesAction extends EditorAction {
649687
reducedSelections.push(lastSelection);
650688

651689
let model = editor.getModel();
690+
if (model === null) {
691+
return;
692+
}
693+
652694
let edits: IIdentifiedSingleEditOperation[] = [];
653695
let endCursorState: Selection[] = [];
654696
let endPrimaryCursor = primaryCursor;
@@ -759,7 +801,15 @@ export class TransposeAction extends EditorAction {
759801

760802
public run(_accessor: ServicesAccessor, editor: ICodeEditor): void {
761803
let selections = editor.getSelections();
804+
if (selections === null) {
805+
return;
806+
}
807+
762808
let model = editor.getModel();
809+
if (model === null) {
810+
return;
811+
}
812+
763813
let commands: ICommand[] = [];
764814

765815
for (let i = 0, len = selections.length; i < len; i++) {
@@ -800,7 +850,15 @@ export class TransposeAction extends EditorAction {
800850
export abstract class AbstractCaseAction extends EditorAction {
801851
public run(_accessor: ServicesAccessor, editor: ICodeEditor): void {
802852
let selections = editor.getSelections();
853+
if (selections === null) {
854+
return;
855+
}
856+
803857
let model = editor.getModel();
858+
if (model === null) {
859+
return;
860+
}
861+
804862
let commands: ICommand[] = [];
805863

806864
for (let i = 0, len = selections.length; i < len; i++) {

src/vs/editor/contrib/linesOperations/sortLinesCommand.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ export class SortLinesCommand implements editorCommon.ICommand {
3333
return helper.getTrackedSelection(this.selectionId);
3434
}
3535

36-
public static canRun(model: ITextModel, selection: Selection, descending: boolean): boolean {
36+
public static canRun(model: ITextModel | null, selection: Selection, descending: boolean): boolean {
37+
if (model === null) {
38+
return false;
39+
}
40+
3741
let data = getSortData(model, selection, descending);
3842

3943
if (!data) {

0 commit comments

Comments
 (0)