Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 38 additions & 67 deletions src/vs/editor/contrib/linesOperations/browser/moveLinesCommand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,28 @@ export class MoveLinesCommand implements ICommand {
this._moveEndLineSelectionShrink = false;
}

public getEditOperations(model: ITextModel, builder: IEditOperationBuilder): void {

const getLanguageId = () => {
return model.getLanguageId();
};
const getLanguageIdAtPosition = (lineNumber: number, column: number) => {
return model.getLanguageIdAtPosition(lineNumber, column);
private createVirtualModel(
model: ITextModel,
lineNumberMapper: (lineNumber: number) => number,
contentOverride?: (lineNumber: number) => string | undefined
): IVirtualModel {
return {
tokenization: {
getLineTokens: (lineNumber) => model.tokenization.getLineTokens(lineNumberMapper(lineNumber)),
getLanguageId: () => model.getLanguageId(),
getLanguageIdAtPosition: (lineNumber, column) => model.getLanguageIdAtPosition(lineNumber, column)
},
getLineContent: (lineNumber) => {
const customContent = contentOverride?.(lineNumber);
if (customContent !== undefined) {
return customContent;
}
return model.getLineContent(lineNumberMapper(lineNumber));
}
};
}

public getEditOperations(model: ITextModel, builder: IEditOperationBuilder): void {

const modelLineCount = model.getLineCount();

Expand Down Expand Up @@ -113,26 +127,10 @@ export class MoveLinesCommand implements ICommand {
insertingText = newIndentation + this.trimStart(movingLineText);
} else {
// no enter rule matches, let's check indentatin rules then.
const virtualModel: IVirtualModel = {
tokenization: {
getLineTokens: (lineNumber: number) => {
if (lineNumber === s.startLineNumber) {
return model.tokenization.getLineTokens(movingLineNumber);
} else {
return model.tokenization.getLineTokens(lineNumber);
}
},
getLanguageId,
getLanguageIdAtPosition,
},
getLineContent: (lineNumber: number) => {
if (lineNumber === s.startLineNumber) {
return model.getLineContent(movingLineNumber);
} else {
return model.getLineContent(lineNumber);
}
},
};
const virtualModel = this.createVirtualModel(
model,
(lineNumber) => lineNumber === s.startLineNumber ? movingLineNumber : lineNumber
);
const indentOfMovingLine = getGoodIndentForLine(
this._autoIndent,
virtualModel,
Expand Down Expand Up @@ -165,31 +163,20 @@ export class MoveLinesCommand implements ICommand {
}
} else {
// it doesn't match onEnter rules, let's check indentation rules then.
const virtualModel: IVirtualModel = {
tokenization: {
getLineTokens: (lineNumber: number) => {
if (lineNumber === s.startLineNumber) {
// TODO@aiday-mar: the tokens here don't correspond exactly to the corresponding content (after indentation adjustment), have to fix this.
return model.tokenization.getLineTokens(movingLineNumber);
} else if (lineNumber >= s.startLineNumber + 1 && lineNumber <= s.endLineNumber + 1) {
return model.tokenization.getLineTokens(lineNumber - 1);
} else {
return model.tokenization.getLineTokens(lineNumber);
}
},
getLanguageId,
getLanguageIdAtPosition,
},
getLineContent: (lineNumber: number) => {
const virtualModel = this.createVirtualModel(
model,
(lineNumber) => {
if (lineNumber === s.startLineNumber) {
return insertingText;
// TODO@aiday-mar: the tokens here don't correspond exactly to the corresponding content (after indentation adjustment), have to fix this.
return movingLineNumber;
} else if (lineNumber >= s.startLineNumber + 1 && lineNumber <= s.endLineNumber + 1) {
return model.getLineContent(lineNumber - 1);
return lineNumber - 1;
} else {
return model.getLineContent(lineNumber);
return lineNumber;
}
},
};
(lineNumber) => lineNumber === s.startLineNumber ? insertingText : undefined
);

const newIndentatOfMovingBlock = getGoodIndentForLine(
this._autoIndent,
Expand Down Expand Up @@ -226,26 +213,10 @@ export class MoveLinesCommand implements ICommand {
builder.addEditOperation(new Range(s.endLineNumber, model.getLineMaxColumn(s.endLineNumber), s.endLineNumber, model.getLineMaxColumn(s.endLineNumber)), '\n' + movingLineText);

if (this.shouldAutoIndent(model, s)) {
const virtualModel: IVirtualModel = {
tokenization: {
getLineTokens: (lineNumber: number) => {
if (lineNumber === movingLineNumber) {
return model.tokenization.getLineTokens(s.startLineNumber);
} else {
return model.tokenization.getLineTokens(lineNumber);
}
},
getLanguageId,
getLanguageIdAtPosition,
},
getLineContent: (lineNumber: number) => {
if (lineNumber === movingLineNumber) {
return model.getLineContent(s.startLineNumber);
} else {
return model.getLineContent(lineNumber);
}
},
};
const virtualModel = this.createVirtualModel(
model,
(lineNumber) => lineNumber === movingLineNumber ? s.startLineNumber : lineNumber
);

const ret = this.matchEnterRule(model, indentConverter, tabSize, s.startLineNumber, s.startLineNumber - 2);
// check if s.startLineNumber - 2 matches onEnter rules, if so adjust the moving block by onEnter rules.
Expand Down