44 *--------------------------------------------------------------------------------------------*/
55'use strict' ;
66
7+ import { mainModule } from 'process' ;
78import { Range , FormattingOptions , Edit , SyntaxKind , ScanError } from '../main' ;
89import { createScanner } from './scanner' ;
910
@@ -37,7 +38,7 @@ export function format(documentText: string, range: Range | undefined, options:
3738 let eol = getEOL ( options , documentText ) ;
3839
3940 let numberLineBreaks = 0 ;
40- let lineBreak = false ;
41+ let needsLineBreak = false ;
4142 let indentLevel = 0 ;
4243 let indentValue : string ;
4344 if ( options . insertSpaces ) {
@@ -50,21 +51,38 @@ export function format(documentText: string, range: Range | undefined, options:
5051 let hasError = false ;
5152
5253 function newLinesAndIndent ( ) : string {
53- if ( numberLineBreaks > 0 ) {
54+ if ( numberLineBreaks > 1 ) {
5455 return repeat ( eol , numberLineBreaks ) + repeat ( indentValue , initialIndentLevel + indentLevel ) ;
5556 } else {
5657 return eol + repeat ( indentValue , initialIndentLevel + indentLevel ) ;
5758 }
5859 }
5960
61+ function multipleLineBreaks ( useVariableNeedsLineBreak = false ) {
62+
63+ if ( numberLineBreaks > 0 ) {
64+ return newLinesAndIndent ( ) ;
65+ } else {
66+ if ( ! useVariableNeedsLineBreak ) {
67+ return ' ' ;
68+ } else if ( useVariableNeedsLineBreak && ! needsLineBreak ) {
69+ return ' ' ;
70+ } else {
71+ return '' ;
72+ }
73+ }
74+ }
75+
6076 function scanNext ( ) : SyntaxKind {
6177 let token = scanner . scan ( ) ;
6278 numberLineBreaks = 0 ;
63- lineBreak = false ;
6479 while ( token === SyntaxKind . Trivia || token === SyntaxKind . LineBreakTrivia ) {
65- lineBreak = lineBreak || ( token === SyntaxKind . LineBreakTrivia ) ;
66- if ( token === SyntaxKind . LineBreakTrivia && options . keepLines ) {
67- numberLineBreaks += 1 ;
80+ if ( token === SyntaxKind . LineBreakTrivia ) {
81+ if ( options . keepLines ) {
82+ numberLineBreaks += 1 ;
83+ } else {
84+ numberLineBreaks = 1 ;
85+ }
6886 }
6987 token = scanner . scan ( ) ;
7088 }
@@ -91,8 +109,9 @@ export function format(documentText: string, range: Range | undefined, options:
91109 let secondToken = scanNext ( ) ;
92110
93111 let replaceContent = '' ;
94- let needsLineBreak = false ;
95- while ( ! lineBreak && ( secondToken === SyntaxKind . LineCommentTrivia || secondToken === SyntaxKind . BlockCommentTrivia ) ) {
112+ needsLineBreak = false ;
113+
114+ while ( numberLineBreaks === 0 && ( secondToken === SyntaxKind . LineCommentTrivia || secondToken === SyntaxKind . BlockCommentTrivia ) ) {
96115 // comments on the same line: keep them on the same line, but ignore them otherwise
97116 let commentTokenStart = scanner . getTokenOffset ( ) + formatTextStart ;
98117 addEdit ( ' ' , firstTokenEnd , commentTokenStart ) ;
@@ -103,53 +122,34 @@ export function format(documentText: string, range: Range | undefined, options:
103122 }
104123
105124 if ( secondToken === SyntaxKind . CloseBraceToken ) {
125+ if ( firstToken !== SyntaxKind . OpenBraceToken ) { indentLevel -- ; } ;
106126 if ( options . keepLines ) {
107- if ( firstToken !== SyntaxKind . OpenBraceToken ) { indentLevel -- ; } ;
108- if ( lineBreak ) {
109- replaceContent = newLinesAndIndent ( ) ;
110- } else {
111- replaceContent = ' ' ;
112- }
113- } else if ( ! options . keepLines && firstToken !== SyntaxKind . OpenBraceToken ) {
114- indentLevel -- ;
127+ replaceContent = multipleLineBreaks ( ) ;
128+ } else if ( firstToken !== SyntaxKind . OpenBraceToken ) {
115129 replaceContent = newLinesAndIndent ( ) ;
116130 }
117131 } else if ( secondToken === SyntaxKind . CloseBracketToken ) {
132+ if ( firstToken !== SyntaxKind . OpenBracketToken ) { indentLevel -- ; } ;
118133 if ( options . keepLines ) {
119- if ( firstToken !== SyntaxKind . OpenBracketToken ) { indentLevel -- ; } ;
120- if ( lineBreak ) {
121- replaceContent = newLinesAndIndent ( ) ;
122- } else {
123- replaceContent = ' ' ;
124- }
134+ replaceContent = multipleLineBreaks ( ) ;
125135 }
126136 else if ( firstToken !== SyntaxKind . OpenBracketToken ) {
127- indentLevel -- ;
128137 replaceContent = newLinesAndIndent ( ) ;
129138 }
130139 } else {
131-
132140 switch ( firstToken ) {
133141 case SyntaxKind . OpenBracketToken :
134142 case SyntaxKind . OpenBraceToken :
135143 indentLevel ++ ;
136144 if ( options . keepLines ) {
137- if ( lineBreak ) {
138- replaceContent = newLinesAndIndent ( ) ;
139- } else {
140- replaceContent = " " ;
141- }
145+ replaceContent = multipleLineBreaks ( ) ;
142146 } else {
143147 replaceContent = newLinesAndIndent ( ) ;
144148 }
145149 break ;
146150 case SyntaxKind . CommaToken :
147- if ( options . keepLines ) {
148- if ( lineBreak ) {
149- replaceContent = newLinesAndIndent ( ) ;
150- } else {
151- replaceContent = " " ;
152- }
151+ if ( options . keepLines ) {
152+ replaceContent = multipleLineBreaks ( ) ;
153153 } else {
154154 replaceContent = newLinesAndIndent ( ) ;
155155 }
@@ -158,19 +158,11 @@ export function format(documentText: string, range: Range | undefined, options:
158158 replaceContent = newLinesAndIndent ( ) ;
159159 break ;
160160 case SyntaxKind . BlockCommentTrivia :
161- if ( lineBreak ) {
162- replaceContent = newLinesAndIndent ( ) ;
163- } else if ( ! needsLineBreak ) {
164- replaceContent = ' ' ;
165- }
161+ replaceContent = multipleLineBreaks ( true ) ;
166162 break ;
167163 case SyntaxKind . ColonToken :
168164 if ( options . keepLines ) {
169- if ( lineBreak ) {
170- replaceContent = newLinesAndIndent ( ) ;
171- } else if ( ! needsLineBreak ) {
172- replaceContent = ' ' ;
173- }
165+ replaceContent = multipleLineBreaks ( true ) ;
174166 } else {
175167 if ( ! needsLineBreak ) {
176168 replaceContent = ' ' ;
@@ -179,7 +171,7 @@ export function format(documentText: string, range: Range | undefined, options:
179171 break ;
180172 case SyntaxKind . StringLiteral :
181173 if ( options . keepLines ) {
182- if ( lineBreak ) {
174+ if ( numberLineBreaks > 0 ) {
183175 replaceContent = newLinesAndIndent ( ) ;
184176 } else {
185177 if ( secondToken === SyntaxKind . ColonToken ) {
@@ -203,7 +195,7 @@ export function format(documentText: string, range: Range | undefined, options:
203195 case SyntaxKind . CloseBraceToken :
204196 case SyntaxKind . CloseBracketToken :
205197 if ( options . keepLines ) {
206- if ( lineBreak ) {
198+ if ( numberLineBreaks > 0 ) {
207199 replaceContent = newLinesAndIndent ( ) ;
208200 } else {
209201 if ( secondToken === SyntaxKind . LineCommentTrivia || secondToken === SyntaxKind . BlockCommentTrivia ) {
@@ -229,13 +221,13 @@ export function format(documentText: string, range: Range | undefined, options:
229221 break ;
230222 }
231223
232- if ( lineBreak && ( secondToken === SyntaxKind . LineCommentTrivia || secondToken === SyntaxKind . BlockCommentTrivia ) ) {
224+ if ( numberLineBreaks > 0 && ( secondToken === SyntaxKind . LineCommentTrivia || secondToken === SyntaxKind . BlockCommentTrivia ) ) {
233225 replaceContent = newLinesAndIndent ( ) ;
234226 }
235227 }
236228 if ( secondToken === SyntaxKind . EOF ) {
237229 if ( options . keepLines ) {
238- if ( lineBreak ) {
230+ if ( numberLineBreaks > 0 ) {
239231 replaceContent = newLinesAndIndent ( ) ;
240232 } else {
241233 replaceContent = options . insertFinalNewline ? eol : '' ;
@@ -294,4 +286,4 @@ function getEOL(options: FormattingOptions, text: string): string {
294286
295287export function isEOL ( text : string , offset : number ) {
296288 return '\r\n' . indexOf ( text . charAt ( offset ) ) !== - 1 ;
297- }
289+ }
0 commit comments