@@ -398,8 +398,10 @@ private final class TokenStreamCreator: SyntaxVisitor {
398
398
}
399
399
400
400
override func visit( _ node: CodeBlockSyntax ) {
401
- for i in 0 ..< ( node. statements. count - 1 ) {
402
- after ( node. statements [ i] . lastToken, tokens: . newline)
401
+ if node. statements. count > 0 {
402
+ for i in 0 ..< ( node. statements. count - 1 ) {
403
+ after ( node. statements [ i] . lastToken, tokens: . newline)
404
+ }
403
405
}
404
406
super. visit ( node)
405
407
}
@@ -1233,123 +1235,145 @@ private final class TokenStreamCreator: SyntaxVisitor {
1233
1235
}
1234
1236
1235
1237
override func visit( _ token: TokenSyntax ) {
1236
- let fileStart = token. previousToken == nil
1237
- extractTrivia ( token. leadingTrivia, fileStart: fileStart)
1238
+ extractLeadingTrivia ( token)
1238
1239
if let before = beforeMap [ token] {
1239
1240
tokens += before
1240
1241
}
1241
1242
appendToken ( . syntax( token) )
1242
- extractTrailingLineComment ( token)
1243
+ extractTrailingComment ( token)
1243
1244
if let afterGroups = afterMap [ token] {
1244
1245
for after in afterGroups. reversed ( ) {
1245
1246
tokens += after
1246
1247
}
1247
1248
}
1248
- extractTrivia ( token. trailingTrivia)
1249
1249
}
1250
1250
1251
- func appendToken( _ token: Token ) {
1252
- if let last = tokens. last {
1253
- switch ( last, token) {
1254
- case ( . comment( let c1) , . comment( let c2) )
1255
- where c1. kind == . docLine && c2. kind == . docLine:
1256
- var newComment = c1
1257
- newComment. addText ( c2. text)
1258
- tokens [ tokens. count - 1 ] = . comment( newComment)
1259
- return
1260
- default :
1261
- break
1251
+ private func extractTrailingComment( _ token: TokenSyntax ) {
1252
+ let nextToken = token. nextToken
1253
+ guard let trivia = nextToken? . leadingTrivia,
1254
+ let firstPiece = trivia [ safe: 0 ] else {
1255
+ return
1256
+ }
1257
+
1258
+ switch firstPiece {
1259
+ case . lineComment( let text) :
1260
+ appendToken ( . break( size: 2 , offset: 2 ) )
1261
+ appendToken ( . comment( Comment ( kind: . line, text: text) ) )
1262
+ if isInContainer ( token) {
1263
+ appendToken ( . newline)
1262
1264
}
1265
+
1266
+ case . blockComment( let text) :
1267
+ appendToken ( . break( size: 2 , offset: 2 ) )
1268
+ appendToken ( . comment( Comment ( kind: . block, text: text) ) )
1269
+ if isInContainer ( token) {
1270
+ appendToken ( . newline)
1271
+ }
1272
+
1273
+ default :
1274
+ return
1263
1275
}
1264
- tokens. append ( token)
1265
1276
}
1266
1277
1267
- private func shouldAddNewlineBefore( _ token: TokenSyntax ? ) -> Bool {
1268
- guard let token = token, let before = beforeMap [ token] else { return false }
1269
- for item in before {
1270
- if case . newlines = item { return false }
1278
+ private func isInContainer( _ token: TokenSyntax ) -> Bool {
1279
+ if token. parent is ArrayElementSyntax || token. parent is DictionaryElementSyntax || token. parent is TupleElementSyntax {
1280
+ return true
1271
1281
}
1272
- return true
1282
+ return false
1273
1283
}
1274
1284
1275
- private func extractTrailingLineComment( _ token: TokenSyntax ) {
1276
- guard let nextToken = token. nextToken else {
1277
- return
1278
- }
1279
- let trivia = nextToken. leadingTrivia
1280
- for (offset, piece) in trivia. enumerated ( ) {
1285
+ private func extractLeadingTrivia( _ token: TokenSyntax ) {
1286
+ let isStartOfFile = token. previousToken == nil
1287
+ let trivia = token. leadingTrivia
1288
+
1289
+ for (index, piece) in trivia. enumerated ( ) {
1281
1290
switch piece {
1282
1291
case . lineComment( let text) :
1283
- if offset > 0 , case . newlines? = trivia [ safe: offset - 1 ] {
1284
- return
1285
- } else {
1286
- appendToken ( . break( size: 2 , offset: 2 ) )
1292
+ if index > 0 || isStartOfFile {
1293
+ if token. withoutTrivia ( ) . text == " } " {
1294
+ if let previousToken = token. previousToken,
1295
+ previousToken. withoutTrivia ( ) . text == " { " {
1296
+ // do nothing
1297
+ } else {
1298
+ appendToken ( . newline)
1299
+ }
1300
+ }
1301
+
1287
1302
appendToken ( . comment( Comment ( kind: . line, text: text) ) )
1288
- if let parent = nextToken. parent? . parent, !( parent is CodeBlockItemSyntax ) {
1303
+
1304
+ if token. withoutTrivia ( ) . text == " } " {
1305
+ appendToken ( . newline( offset: - 2 ) )
1306
+ } else {
1289
1307
appendToken ( . newline)
1290
1308
}
1291
- return
1292
1309
}
1310
+
1293
1311
case . blockComment( let text) :
1294
- if offset > 0 , case . newlines? = trivia [ safe: offset - 1 ] {
1295
- return
1296
- } else {
1297
- appendToken ( . break( size: 2 , offset: 2 ) )
1312
+ if index > 0 || isStartOfFile {
1313
+ if token. withoutTrivia ( ) . text == " } " {
1314
+ if let previousToken = token. previousToken,
1315
+ previousToken. withoutTrivia ( ) . text == " { " {
1316
+ // do nothing
1317
+ } else {
1318
+ appendToken ( . newline)
1319
+ }
1320
+ }
1321
+
1298
1322
appendToken ( . comment( Comment ( kind: . block, text: text) ) )
1299
- if let parent = nextToken. parent? . parent, !( parent is CodeBlockItemSyntax ) {
1323
+
1324
+ if token. withoutTrivia ( ) . text == " } " {
1325
+ appendToken ( . newline( offset: - 2 ) )
1326
+ } else {
1300
1327
appendToken ( . newline)
1301
1328
}
1302
- return
1303
1329
}
1304
- default :
1305
- break
1306
- }
1307
- }
1308
- }
1309
1330
1310
- private func extractTrivia( _ trivia: Trivia , fileStart: Bool = false ) {
1311
- for (offset, piece) in trivia. enumerated ( ) {
1312
- switch piece {
1313
- case . lineComment( let text) :
1314
- if fileStart {
1315
- appendToken ( . comment( Comment ( kind: . line, text: text) ) )
1316
- appendToken ( . newline)
1317
- } else if offset > 0 , case . newlines? = trivia [ safe: offset - 1 ] {
1318
- appendToken ( . comment( Comment ( kind: . line, text: text) ) )
1319
- appendToken ( . newline)
1320
- }
1321
- case . blockComment( let text) :
1322
- if fileStart {
1323
- appendToken ( . comment( Comment ( kind: . block, text: text) ) )
1324
- appendToken ( . newline)
1325
- } else if offset > 0 , case . newlines? = trivia [ safe: offset - 1 ] {
1326
- appendToken ( . comment( Comment ( kind: . block, text: text) ) )
1327
- appendToken ( . newline)
1328
- }
1329
1331
case . docLineComment( let text) :
1330
1332
appendToken ( . comment( Comment ( kind: . docLine, text: text) ) )
1331
- if case . newlines? = trivia [ safe: offset + 1 ] ,
1332
- case . docLineComment? = trivia [ safe: offset + 2 ] {
1333
- /* do nothing */
1333
+ if case . newlines? = trivia [ safe: index + 1 ] ,
1334
+ case . docLineComment? = trivia [ safe: index + 2 ] {
1335
+ // do nothing
1334
1336
} else {
1335
1337
appendToken ( . newline)
1336
1338
}
1339
+
1337
1340
case . docBlockComment( let text) :
1338
1341
appendToken ( . comment( Comment ( kind: . docBlock, text: text) ) )
1339
- if case . newlines? = trivia [ safe: offset + 1 ] ,
1340
- case . docLineComment? = trivia [ safe: offset + 2 ] {
1341
- /* do nothing */
1342
- } else {
1343
- appendToken ( . newline)
1344
- }
1342
+ appendToken ( . newline)
1343
+
1345
1344
case . newlines( let n) , . carriageReturns( let n) , . carriageReturnLineFeeds( let n) :
1346
1345
if n > 1 {
1347
1346
appendToken ( . newlines( min ( n - 1 , config. maximumBlankLines) , offset: 0 ) )
1348
1347
}
1348
+
1349
+ default :
1350
+ break
1351
+ }
1352
+ }
1353
+ }
1354
+
1355
+ func appendToken( _ token: Token ) {
1356
+ if let last = tokens. last {
1357
+ switch ( last, token) {
1358
+ case ( . comment( let c1) , . comment( let c2) )
1359
+ where c1. kind == . docLine && c2. kind == . docLine:
1360
+ var newComment = c1
1361
+ newComment. addText ( c2. text)
1362
+ tokens [ tokens. count - 1 ] = . comment( newComment)
1363
+ return
1349
1364
default :
1350
1365
break
1351
1366
}
1352
1367
}
1368
+ tokens. append ( token)
1369
+ }
1370
+
1371
+ private func shouldAddNewlineBefore( _ token: TokenSyntax ? ) -> Bool {
1372
+ guard let token = token, let before = beforeMap [ token] else { return false }
1373
+ for item in before {
1374
+ if case . newlines = item { return false }
1375
+ }
1376
+ return true
1353
1377
}
1354
1378
}
1355
1379
0 commit comments