4
4
*--------------------------------------------------------------------------------------------*/
5
5
'use strict' ;
6
6
7
+ import { mainModule } from 'process' ;
7
8
import { Range , FormattingOptions , Edit , SyntaxKind , ScanError } from '../main' ;
8
9
import { createScanner } from './scanner' ;
9
10
@@ -37,7 +38,7 @@ export function format(documentText: string, range: Range | undefined, options:
37
38
let eol = getEOL ( options , documentText ) ;
38
39
39
40
let numberLineBreaks = 0 ;
40
- let lineBreak = false ;
41
+ let needsLineBreak = false ;
41
42
let indentLevel = 0 ;
42
43
let indentValue : string ;
43
44
if ( options . insertSpaces ) {
@@ -50,21 +51,38 @@ export function format(documentText: string, range: Range | undefined, options:
50
51
let hasError = false ;
51
52
52
53
function newLinesAndIndent ( ) : string {
53
- if ( numberLineBreaks > 0 ) {
54
+ if ( numberLineBreaks > 1 ) {
54
55
return repeat ( eol , numberLineBreaks ) + repeat ( indentValue , initialIndentLevel + indentLevel ) ;
55
56
} else {
56
57
return eol + repeat ( indentValue , initialIndentLevel + indentLevel ) ;
57
58
}
58
59
}
59
60
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
+
60
76
function scanNext ( ) : SyntaxKind {
61
77
let token = scanner . scan ( ) ;
62
78
numberLineBreaks = 0 ;
63
- lineBreak = false ;
64
79
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
+ }
68
86
}
69
87
token = scanner . scan ( ) ;
70
88
}
@@ -91,8 +109,9 @@ export function format(documentText: string, range: Range | undefined, options:
91
109
let secondToken = scanNext ( ) ;
92
110
93
111
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 ) ) {
96
115
// comments on the same line: keep them on the same line, but ignore them otherwise
97
116
let commentTokenStart = scanner . getTokenOffset ( ) + formatTextStart ;
98
117
addEdit ( ' ' , firstTokenEnd , commentTokenStart ) ;
@@ -103,53 +122,34 @@ export function format(documentText: string, range: Range | undefined, options:
103
122
}
104
123
105
124
if ( secondToken === SyntaxKind . CloseBraceToken ) {
125
+ if ( firstToken !== SyntaxKind . OpenBraceToken ) { indentLevel -- ; } ;
106
126
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 ) {
115
129
replaceContent = newLinesAndIndent ( ) ;
116
130
}
117
131
} else if ( secondToken === SyntaxKind . CloseBracketToken ) {
132
+ if ( firstToken !== SyntaxKind . OpenBracketToken ) { indentLevel -- ; } ;
118
133
if ( options . keepLines ) {
119
- if ( firstToken !== SyntaxKind . OpenBracketToken ) { indentLevel -- ; } ;
120
- if ( lineBreak ) {
121
- replaceContent = newLinesAndIndent ( ) ;
122
- } else {
123
- replaceContent = ' ' ;
124
- }
134
+ replaceContent = multipleLineBreaks ( ) ;
125
135
}
126
136
else if ( firstToken !== SyntaxKind . OpenBracketToken ) {
127
- indentLevel -- ;
128
137
replaceContent = newLinesAndIndent ( ) ;
129
138
}
130
139
} else {
131
-
132
140
switch ( firstToken ) {
133
141
case SyntaxKind . OpenBracketToken :
134
142
case SyntaxKind . OpenBraceToken :
135
143
indentLevel ++ ;
136
144
if ( options . keepLines ) {
137
- if ( lineBreak ) {
138
- replaceContent = newLinesAndIndent ( ) ;
139
- } else {
140
- replaceContent = " " ;
141
- }
145
+ replaceContent = multipleLineBreaks ( ) ;
142
146
} else {
143
147
replaceContent = newLinesAndIndent ( ) ;
144
148
}
145
149
break ;
146
150
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 ( ) ;
153
153
} else {
154
154
replaceContent = newLinesAndIndent ( ) ;
155
155
}
@@ -158,19 +158,11 @@ export function format(documentText: string, range: Range | undefined, options:
158
158
replaceContent = newLinesAndIndent ( ) ;
159
159
break ;
160
160
case SyntaxKind . BlockCommentTrivia :
161
- if ( lineBreak ) {
162
- replaceContent = newLinesAndIndent ( ) ;
163
- } else if ( ! needsLineBreak ) {
164
- replaceContent = ' ' ;
165
- }
161
+ replaceContent = multipleLineBreaks ( true ) ;
166
162
break ;
167
163
case SyntaxKind . ColonToken :
168
164
if ( options . keepLines ) {
169
- if ( lineBreak ) {
170
- replaceContent = newLinesAndIndent ( ) ;
171
- } else if ( ! needsLineBreak ) {
172
- replaceContent = ' ' ;
173
- }
165
+ replaceContent = multipleLineBreaks ( true ) ;
174
166
} else {
175
167
if ( ! needsLineBreak ) {
176
168
replaceContent = ' ' ;
@@ -179,7 +171,7 @@ export function format(documentText: string, range: Range | undefined, options:
179
171
break ;
180
172
case SyntaxKind . StringLiteral :
181
173
if ( options . keepLines ) {
182
- if ( lineBreak ) {
174
+ if ( numberLineBreaks > 0 ) {
183
175
replaceContent = newLinesAndIndent ( ) ;
184
176
} else {
185
177
if ( secondToken === SyntaxKind . ColonToken ) {
@@ -203,7 +195,7 @@ export function format(documentText: string, range: Range | undefined, options:
203
195
case SyntaxKind . CloseBraceToken :
204
196
case SyntaxKind . CloseBracketToken :
205
197
if ( options . keepLines ) {
206
- if ( lineBreak ) {
198
+ if ( numberLineBreaks > 0 ) {
207
199
replaceContent = newLinesAndIndent ( ) ;
208
200
} else {
209
201
if ( secondToken === SyntaxKind . LineCommentTrivia || secondToken === SyntaxKind . BlockCommentTrivia ) {
@@ -229,13 +221,13 @@ export function format(documentText: string, range: Range | undefined, options:
229
221
break ;
230
222
}
231
223
232
- if ( lineBreak && ( secondToken === SyntaxKind . LineCommentTrivia || secondToken === SyntaxKind . BlockCommentTrivia ) ) {
224
+ if ( numberLineBreaks > 0 && ( secondToken === SyntaxKind . LineCommentTrivia || secondToken === SyntaxKind . BlockCommentTrivia ) ) {
233
225
replaceContent = newLinesAndIndent ( ) ;
234
226
}
235
227
}
236
228
if ( secondToken === SyntaxKind . EOF ) {
237
229
if ( options . keepLines ) {
238
- if ( lineBreak ) {
230
+ if ( numberLineBreaks > 0 ) {
239
231
replaceContent = newLinesAndIndent ( ) ;
240
232
} else {
241
233
replaceContent = options . insertFinalNewline ? eol : '' ;
@@ -294,4 +286,4 @@ function getEOL(options: FormattingOptions, text: string): string {
294
286
295
287
export function isEOL ( text : string , offset : number ) {
296
288
return '\r\n' . indexOf ( text . charAt ( offset ) ) !== - 1 ;
297
- }
289
+ }
0 commit comments