Skip to content

Commit 3ab5eed

Browse files
authored
Fixing command move regression (microsoft#214577)
* adding console logs * polishing the code
1 parent 21decd9 commit 3ab5eed

File tree

1 file changed

+68
-34
lines changed

1 file changed

+68
-34
lines changed

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

+68-34
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ export class MoveLinesCommand implements ICommand {
4242

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

45+
const getLanguageId = () => {
46+
return model.getLanguageId();
47+
};
48+
const getLanguageIdAtPosition = (lineNumber: number, column: number) => {
49+
return model.getLanguageIdAtPosition(lineNumber, column);
50+
};
51+
4552
const modelLineCount = model.getLineCount();
4653

4754
if (this._isMovingDown && this._selection.endLineNumber === modelLineCount) {
@@ -63,20 +70,6 @@ export class MoveLinesCommand implements ICommand {
6370

6471
const { tabSize, indentSize, insertSpaces } = model.getOptions();
6572
const indentConverter = this.buildIndentConverter(tabSize, indentSize, insertSpaces);
66-
const virtualModel: IVirtualModel = {
67-
tokenization: {
68-
getLineTokens: (lineNumber: number) => {
69-
return model.tokenization.getLineTokens(lineNumber);
70-
},
71-
getLanguageId: () => {
72-
return model.getLanguageId();
73-
},
74-
getLanguageIdAtPosition: (lineNumber: number, column: number) => {
75-
return model.getLanguageIdAtPosition(lineNumber, column);
76-
},
77-
},
78-
getLineContent: null as unknown as (lineNumber: number) => string,
79-
};
8073

8174
if (s.startLineNumber === s.endLineNumber && model.getLineMaxColumn(s.startLineNumber) === 1) {
8275
// Current line is empty
@@ -120,12 +113,25 @@ export class MoveLinesCommand implements ICommand {
120113
insertingText = newIndentation + this.trimStart(movingLineText);
121114
} else {
122115
// no enter rule matches, let's check indentatin rules then.
123-
virtualModel.getLineContent = (lineNumber: number) => {
124-
if (lineNumber === s.startLineNumber) {
125-
return model.getLineContent(movingLineNumber);
126-
} else {
127-
return model.getLineContent(lineNumber);
128-
}
116+
const virtualModel: IVirtualModel = {
117+
tokenization: {
118+
getLineTokens: (lineNumber: number) => {
119+
if (lineNumber === s.startLineNumber) {
120+
return model.tokenization.getLineTokens(movingLineNumber);
121+
} else {
122+
return model.tokenization.getLineTokens(lineNumber);
123+
}
124+
},
125+
getLanguageId,
126+
getLanguageIdAtPosition,
127+
},
128+
getLineContent: (lineNumber: number) => {
129+
if (lineNumber === s.startLineNumber) {
130+
return model.getLineContent(movingLineNumber);
131+
} else {
132+
return model.getLineContent(lineNumber);
133+
}
134+
},
129135
};
130136
const indentOfMovingLine = getGoodIndentForLine(
131137
this._autoIndent,
@@ -159,14 +165,29 @@ export class MoveLinesCommand implements ICommand {
159165
}
160166
} else {
161167
// it doesn't match onEnter rules, let's check indentation rules then.
162-
virtualModel.getLineContent = (lineNumber: number) => {
163-
if (lineNumber === s.startLineNumber) {
164-
return insertingText;
165-
} else if (lineNumber >= s.startLineNumber + 1 && lineNumber <= s.endLineNumber + 1) {
166-
return model.getLineContent(lineNumber - 1);
167-
} else {
168-
return model.getLineContent(lineNumber);
169-
}
168+
const virtualModel: IVirtualModel = {
169+
tokenization: {
170+
getLineTokens: (lineNumber: number) => {
171+
if (lineNumber === s.startLineNumber) {
172+
return model.tokenization.getLineTokens(movingLineNumber);
173+
} else if (lineNumber >= s.startLineNumber + 1 && lineNumber <= s.endLineNumber + 1) {
174+
return model.tokenization.getLineTokens(lineNumber - 1);
175+
} else {
176+
return model.tokenization.getLineTokens(lineNumber);
177+
}
178+
},
179+
getLanguageId,
180+
getLanguageIdAtPosition,
181+
},
182+
getLineContent: (lineNumber: number) => {
183+
if (lineNumber === s.startLineNumber) {
184+
return insertingText;
185+
} else if (lineNumber >= s.startLineNumber + 1 && lineNumber <= s.endLineNumber + 1) {
186+
return model.getLineContent(lineNumber - 1);
187+
} else {
188+
return model.getLineContent(lineNumber);
189+
}
190+
},
170191
};
171192

172193
const newIndentatOfMovingBlock = getGoodIndentForLine(
@@ -204,12 +225,25 @@ export class MoveLinesCommand implements ICommand {
204225
builder.addEditOperation(new Range(s.endLineNumber, model.getLineMaxColumn(s.endLineNumber), s.endLineNumber, model.getLineMaxColumn(s.endLineNumber)), '\n' + movingLineText);
205226

206227
if (this.shouldAutoIndent(model, s)) {
207-
virtualModel.getLineContent = (lineNumber: number) => {
208-
if (lineNumber === movingLineNumber) {
209-
return model.getLineContent(s.startLineNumber);
210-
} else {
211-
return model.getLineContent(lineNumber);
212-
}
228+
const virtualModel: IVirtualModel = {
229+
tokenization: {
230+
getLineTokens: (lineNumber: number) => {
231+
if (lineNumber === movingLineNumber) {
232+
return model.tokenization.getLineTokens(s.startLineNumber);
233+
} else {
234+
return model.tokenization.getLineTokens(lineNumber);
235+
}
236+
},
237+
getLanguageId,
238+
getLanguageIdAtPosition,
239+
},
240+
getLineContent: (lineNumber: number) => {
241+
if (lineNumber === movingLineNumber) {
242+
return model.getLineContent(s.startLineNumber);
243+
} else {
244+
return model.getLineContent(lineNumber);
245+
}
246+
},
213247
};
214248

215249
const ret = this.matchEnterRule(model, indentConverter, tabSize, s.startLineNumber, s.startLineNumber - 2);

0 commit comments

Comments
 (0)