@@ -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