@@ -10,6 +10,7 @@ import { Selection } from 'vs/editor/common/core/selection';
1010import { ICommand , ICursorStateComputerData , IEditOperationBuilder , ITokenizedModel } from 'vs/editor/common/editorCommon' ;
1111import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry' ;
1212import { ShiftCommand } from 'vs/editor/common/commands/shiftCommand' ;
13+ import * as IndentUtil from 'vs/editor/contrib/indentation/common/indentUtils' ;
1314
1415export class MoveLinesCommand implements ICommand {
1516
@@ -113,22 +114,22 @@ export class MoveLinesCommand implements ICommand {
113114 let insertingText = movingLineText ;
114115 // Insert line that needs to be moved before
115116
116- if ( this . _autoIndent ) {
117+ if ( this . isAutoIndent ( model , s ) ) {
117118 virtualModel . getLineContent = ( lineNumber ) => {
118119 if ( lineNumber === s . startLineNumber ) {
119120 return model . getLineContent ( movingLineNumber ) ;
120121 } else {
121122 return model . getLineContent ( lineNumber ) ;
122123 }
123124 } ;
124- let newIndentation = LanguageConfigurationRegistry . getGoodIndentForLine ( virtualModel , model . getLanguageIdAtPosition (
125+ let indentOfMovingLine = LanguageConfigurationRegistry . getGoodIndentForLine ( virtualModel , model . getLanguageIdAtPosition (
125126 movingLineNumber , 1 ) , s . startLineNumber , indentConverter ) ;
126- if ( newIndentation !== null ) {
127+ if ( indentOfMovingLine !== null ) {
127128 let oldIndentation = strings . getLeadingWhitespace ( model . getLineContent ( movingLineNumber ) ) ;
128- let newSpaceCnt = this . getSpaceCnt ( newIndentation , tabSize ) ;
129- let oldSpaceCnt = this . getSpaceCnt ( oldIndentation , tabSize ) ;
129+ let newSpaceCnt = IndentUtil . getSpaceCnt ( indentOfMovingLine , tabSize ) ;
130+ let oldSpaceCnt = IndentUtil . getSpaceCnt ( oldIndentation , tabSize ) ;
130131 if ( newSpaceCnt !== oldSpaceCnt ) {
131- let newIndentation = this . generateIndent ( newSpaceCnt , tabSize , insertSpaces ) ;
132+ let newIndentation = IndentUtil . generateIndent ( newSpaceCnt , tabSize , insertSpaces ) ;
132133 insertingText = newIndentation + strings . ltrim ( strings . ltrim ( movingLineText ) , '\t' ) ;
133134 }
134135 }
@@ -147,27 +148,17 @@ export class MoveLinesCommand implements ICommand {
147148 }
148149 } ;
149150
150- let newIndentationForMovingBlock = LanguageConfigurationRegistry . getGoodIndentForLine ( virtualModel , model . getLanguageIdAtPosition (
151+ let newIndentatOfMovingBlock = LanguageConfigurationRegistry . getGoodIndentForLine ( virtualModel , model . getLanguageIdAtPosition (
151152 movingLineNumber , 1 ) , s . startLineNumber + 1 , indentConverter ) ;
152153
153- if ( newIndentationForMovingBlock !== null ) {
154- let oldIndentation = strings . getLeadingWhitespace ( model . getLineContent ( s . startLineNumber ) ) ;
155- let newSpaceCnt = this . getSpaceCnt ( newIndentationForMovingBlock , tabSize ) ;
156- let oldSpaceCnt = this . getSpaceCnt ( oldIndentation , tabSize ) ;
154+ if ( newIndentatOfMovingBlock !== null ) {
155+ const oldIndentation = strings . getLeadingWhitespace ( model . getLineContent ( s . startLineNumber ) ) ;
156+ const newSpaceCnt = IndentUtil . getSpaceCnt ( newIndentatOfMovingBlock , tabSize ) ;
157+ const oldSpaceCnt = IndentUtil . getSpaceCnt ( oldIndentation , tabSize ) ;
157158 if ( newSpaceCnt !== oldSpaceCnt ) {
158- let spaceCntOffset = newSpaceCnt - oldSpaceCnt ;
159+ const spaceCntOffset = newSpaceCnt - oldSpaceCnt ;
159160
160- for ( let i = s . startLineNumber ; i <= s . endLineNumber ; i ++ ) {
161- let lineContent = model . getLineContent ( i ) ;
162- let originalIndent = strings . getLeadingWhitespace ( lineContent ) ;
163- let originalSpacesCnt = this . getSpaceCnt ( originalIndent , tabSize ) ;
164- let newSpacesCnt = originalSpacesCnt + spaceCntOffset ;
165- let newIndent = this . generateIndent ( newSpacesCnt , tabSize , insertSpaces ) ;
166-
167- if ( newIndent !== originalIndent ) {
168- builder . addEditOperation ( new Range ( i , 1 , i , originalIndent . length + 1 ) , newIndent ) ;
169- }
170- }
161+ this . getIndentEditsOfMovingBlock ( model , builder , s . startLineNumber , s . endLineNumber , tabSize , insertSpaces , spaceCntOffset ) ;
171162 }
172163 }
173164 } else {
@@ -183,7 +174,7 @@ export class MoveLinesCommand implements ICommand {
183174 // Insert line that needs to be moved after
184175 builder . addEditOperation ( new Range ( s . endLineNumber , model . getLineMaxColumn ( s . endLineNumber ) , s . endLineNumber , model . getLineMaxColumn ( s . endLineNumber ) ) , '\n' + movingLineText ) ;
185176
186- if ( this . _autoIndent && ( model . getLanguageIdAtPosition ( s . startLineNumber , 1 ) === model . getLanguageIdAtPosition ( s . endLineNumber , 1 ) ) ) {
177+ if ( this . isAutoIndent ( model , s ) ) {
187178 virtualModel . getLineContent = ( lineNumber : number ) => {
188179 if ( lineNumber === movingLineNumber ) {
189180 return model . getLineContent ( s . startLineNumber ) ;
@@ -192,26 +183,16 @@ export class MoveLinesCommand implements ICommand {
192183 }
193184 } ;
194185
195- let newIndentation = LanguageConfigurationRegistry . getGoodIndentForLine ( virtualModel , model . getLanguageIdAtPosition ( s . startLineNumber , 1 ) , movingLineNumber , indentConverter ) ;
196- if ( newIndentation !== null ) {
186+ let indentOfFirstLine = LanguageConfigurationRegistry . getGoodIndentForLine ( virtualModel , model . getLanguageIdAtPosition ( s . startLineNumber , 1 ) , movingLineNumber , indentConverter ) ;
187+ if ( indentOfFirstLine !== null ) {
197188 // adjust the indentation of the moving block
198- let oldIndentation = strings . getLeadingWhitespace ( model . getLineContent ( s . startLineNumber ) ) ;
199- let newSpaceCnt = this . getSpaceCnt ( newIndentation , tabSize ) ;
200- let oldSpaceCnt = this . getSpaceCnt ( oldIndentation , tabSize ) ;
189+ let oldIndent = strings . getLeadingWhitespace ( model . getLineContent ( s . startLineNumber ) ) ;
190+ let newSpaceCnt = IndentUtil . getSpaceCnt ( indentOfFirstLine , tabSize ) ;
191+ let oldSpaceCnt = IndentUtil . getSpaceCnt ( oldIndent , tabSize ) ;
201192 if ( newSpaceCnt !== oldSpaceCnt ) {
202193 let spaceCntOffset = newSpaceCnt - oldSpaceCnt ;
203194
204- for ( let i = s . startLineNumber ; i <= s . endLineNumber ; i ++ ) {
205- let lineContent = model . getLineContent ( i ) ;
206- let originalIndent = strings . getLeadingWhitespace ( lineContent ) ;
207- let originalSpacesCnt = this . getSpaceCnt ( originalIndent , tabSize ) ;
208- let newSpacesCnt = originalSpacesCnt + spaceCntOffset ;
209- let newIndent = this . generateIndent ( newSpacesCnt , tabSize , insertSpaces ) ;
210-
211- if ( newIndent !== originalIndent ) {
212- builder . addEditOperation ( new Range ( i , 1 , i , originalIndent . length + 1 ) , newIndent ) ;
213- }
214- }
195+ this . getIndentEditsOfMovingBlock ( model , builder , s . startLineNumber , s . endLineNumber , tabSize , insertSpaces , spaceCntOffset ) ;
215196 }
216197 }
217198 }
@@ -221,37 +202,22 @@ export class MoveLinesCommand implements ICommand {
221202 this . _selectionId = builder . trackSelection ( s ) ;
222203 }
223204
224- private getSpaceCnt ( str , tabSize ) {
225- let spacesCnt = 0 ;
226-
227- for ( let i = 0 ; i < str . length ; i ++ ) {
228- if ( str . charAt ( i ) === '\t' ) {
229- spacesCnt += tabSize ;
230- } else {
231- spacesCnt ++ ;
232- }
233- }
234-
235- return spacesCnt ;
205+ private isAutoIndent ( model : ITokenizedModel , selection : Selection ) {
206+ return this . _autoIndent && ( model . getLanguageIdAtPosition ( selection . startLineNumber , 1 ) === model . getLanguageIdAtPosition ( selection . endLineNumber , 1 ) ) ;
236207 }
237208
238- private generateIndent ( spacesCnt : number , tabSize , insertSpaces ) {
239- spacesCnt = spacesCnt < 0 ? 0 : spacesCnt ;
209+ private getIndentEditsOfMovingBlock ( model : ITokenizedModel , builder : IEditOperationBuilder , startLineNumber : number , endLineNumber : number , tabSize : number , insertSpaces : boolean , offset : number ) {
210+ for ( let i = startLineNumber ; i <= endLineNumber ; i ++ ) {
211+ let lineContent = model . getLineContent ( i ) ;
212+ let originalIndent = strings . getLeadingWhitespace ( lineContent ) ;
213+ let originalSpacesCnt = IndentUtil . getSpaceCnt ( originalIndent , tabSize ) ;
214+ let newSpacesCnt = originalSpacesCnt + offset ;
215+ let newIndent = IndentUtil . generateIndent ( newSpacesCnt , tabSize , insertSpaces ) ;
240216
241- let result = '' ;
242- if ( ! insertSpaces ) {
243- let tabsCnt = Math . floor ( spacesCnt / tabSize ) ;
244- spacesCnt = spacesCnt % tabSize ;
245- for ( let i = 0 ; i < tabsCnt ; i ++ ) {
246- result += '\t' ;
217+ if ( newIndent !== originalIndent ) {
218+ builder . addEditOperation ( new Range ( i , 1 , i , originalIndent . length + 1 ) , newIndent ) ;
247219 }
248220 }
249-
250- for ( let i = 0 ; i < spacesCnt ; i ++ ) {
251- result += ' ' ;
252- }
253-
254- return result ;
255221 }
256222
257223 public computeCursorState ( model : ITokenizedModel , helper : ICursorStateComputerData ) : Selection {
0 commit comments