@@ -21,6 +21,21 @@ namespace ts.server {
2121 return spaceCache [ n ] ;
2222 }
2323
24+ export function generateIndentString ( n : number , editorOptions : EditorOptions ) : string {
25+ if ( editorOptions . ConvertTabsToSpaces ) {
26+ return generateSpaces ( n ) ;
27+ } else {
28+ var result = "" ;
29+ for ( var i = 0 ; i < Math . floor ( n / editorOptions . TabSize ) ; i ++ ) {
30+ result += "\t" ;
31+ }
32+ for ( var i = 0 ; i < n % editorOptions . TabSize ; i ++ ) {
33+ result += " " ;
34+ }
35+ return result ;
36+ }
37+ }
38+
2439 interface FileStart {
2540 file : string ;
2641 start : ILineInfo ;
@@ -608,27 +623,25 @@ namespace ts.server {
608623 ConvertTabsToSpaces : formatOptions . ConvertTabsToSpaces ,
609624 IndentStyle : ts . IndentStyle . Smart ,
610625 } ;
611- var indentPosition =
612- compilerService . languageService . getIndentationAtPosition ( file , position , editorOptions ) ;
626+ var preferredIndent = compilerService . languageService . getIndentationAtPosition ( file , position , editorOptions ) ;
627+ var hasIndent = 0 ;
613628 for ( var i = 0 , len = lineText . length ; i < len ; i ++ ) {
614629 if ( lineText . charAt ( i ) == " " ) {
615- indentPosition -- ;
630+ hasIndent ++ ;
616631 }
617632 else if ( lineText . charAt ( i ) == "\t" ) {
618- indentPosition - = editorOptions . IndentSize ;
633+ hasIndent + = editorOptions . TabSize ;
619634 }
620635 else {
621636 break ;
622637 }
623638 }
624- if ( indentPosition > 0 ) {
625- var spaces = generateSpaces ( indentPosition ) ;
626- edits . push ( { span : ts . createTextSpanFromBounds ( position , position ) , newText : spaces } ) ;
627- }
628- else if ( indentPosition < 0 ) {
639+ // i points to the first non whitespace character
640+ if ( preferredIndent !== hasIndent ) {
641+ var firstNoWhiteSpacePosition = lineInfo . offset + i ;
629642 edits . push ( {
630- span : ts . createTextSpanFromBounds ( position , position - indentPosition ) ,
631- newText : ""
643+ span : ts . createTextSpanFromBounds ( lineInfo . offset , firstNoWhiteSpacePosition ) ,
644+ newText : generateIndentString ( preferredIndent , editorOptions )
632645 } ) ;
633646 }
634647 }
0 commit comments