@@ -42,6 +42,13 @@ export class MoveLinesCommand implements ICommand {
42
42
43
43
public getEditOperations ( model : ITextModel , builder : IEditOperationBuilder ) : void {
44
44
45
+ const getLanguageId = ( ) => {
46
+ return model . getLanguageId ( ) ;
47
+ } ;
48
+ const getLanguageIdAtPosition = ( lineNumber : number , column : number ) => {
49
+ return model . getLanguageIdAtPosition ( lineNumber , column ) ;
50
+ } ;
51
+
45
52
const modelLineCount = model . getLineCount ( ) ;
46
53
47
54
if ( this . _isMovingDown && this . _selection . endLineNumber === modelLineCount ) {
@@ -63,20 +70,6 @@ export class MoveLinesCommand implements ICommand {
63
70
64
71
const { tabSize, indentSize, insertSpaces } = model . getOptions ( ) ;
65
72
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
- } ;
80
73
81
74
if ( s . startLineNumber === s . endLineNumber && model . getLineMaxColumn ( s . startLineNumber ) === 1 ) {
82
75
// Current line is empty
@@ -120,12 +113,25 @@ export class MoveLinesCommand implements ICommand {
120
113
insertingText = newIndentation + this . trimStart ( movingLineText ) ;
121
114
} else {
122
115
// 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
+ } ,
129
135
} ;
130
136
const indentOfMovingLine = getGoodIndentForLine (
131
137
this . _autoIndent ,
@@ -159,14 +165,29 @@ export class MoveLinesCommand implements ICommand {
159
165
}
160
166
} else {
161
167
// 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
+ } ,
170
191
} ;
171
192
172
193
const newIndentatOfMovingBlock = getGoodIndentForLine (
@@ -204,12 +225,25 @@ export class MoveLinesCommand implements ICommand {
204
225
builder . addEditOperation ( new Range ( s . endLineNumber , model . getLineMaxColumn ( s . endLineNumber ) , s . endLineNumber , model . getLineMaxColumn ( s . endLineNumber ) ) , '\n' + movingLineText ) ;
205
226
206
227
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
+ } ,
213
247
} ;
214
248
215
249
const ret = this . matchEnterRule ( model , indentConverter , tabSize , s . startLineNumber , s . startLineNumber - 2 ) ;
0 commit comments