Path: blob/main/src/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLineCommand.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as strings from '../../../../base/common/strings.js';6import { EditOperation, ISingleEditOperation } from '../../../common/core/editOperation.js';7import { Position } from '../../../common/core/position.js';8import { Selection } from '../../../common/core/selection.js';9import { ICommand, ICursorStateComputerData, IEditOperationBuilder } from '../../../common/editorCommon.js';10import { ITextModel } from '../../../common/model.js';1112export class InsertFinalNewLineCommand implements ICommand {1314private readonly _selection: Selection;15private _selectionId: string | null;161718constructor(selection: Selection) {19this._selection = selection;20this._selectionId = null;21}2223public getEditOperations(model: ITextModel, builder: IEditOperationBuilder): void {24const op = insertFinalNewLine(model);25if (op) {26builder.addEditOperation(op.range, op.text);27}28this._selectionId = builder.trackSelection(this._selection);29}3031public computeCursorState(model: ITextModel, helper: ICursorStateComputerData): Selection {32return helper.getTrackedSelection(this._selectionId!);33}34}3536/**37* Generate edit operations for inserting a final new line if needed.38* Returns undefined if no edit is needed.39*/40export function insertFinalNewLine(model: ITextModel): ISingleEditOperation | undefined {41const lineCount = model.getLineCount();42const lastLine = model.getLineContent(lineCount);43const lastLineIsEmptyOrWhitespace = strings.lastNonWhitespaceIndex(lastLine) === -1;4445if (!lineCount || lastLineIsEmptyOrWhitespace) {46return;47}4849return EditOperation.insert(50new Position(lineCount, model.getLineMaxColumn(lineCount)),51model.getEOL()52);53}545556