@@ -1205,27 +1205,29 @@ private final class TokenStreamCreator: SyntaxVisitor {
1205
1205
}
1206
1206
1207
1207
override func visit( _ token: TokenSyntax ) {
1208
- breakDownTrivia ( token. leadingTrivia, before: token)
1208
+ let fileStart = token. previousToken == nil
1209
+ extractTrivia ( token. leadingTrivia, fileStart: fileStart)
1209
1210
if let before = beforeMap [ token] {
1210
1211
tokens += before
1211
1212
}
1212
1213
appendToken ( . syntax( token) )
1214
+ extractTrailingLineComment ( token)
1213
1215
if let afterGroups = afterMap [ token] {
1214
1216
for after in afterGroups. reversed ( ) {
1215
1217
tokens += after
1216
1218
}
1217
1219
}
1218
- breakDownTrivia ( token. trailingTrivia)
1220
+ extractTrivia ( token. trailingTrivia)
1219
1221
}
1220
1222
1221
1223
func appendToken( _ token: Token ) {
1222
1224
if let last = tokens. last {
1223
1225
switch ( last, token) {
1224
- case ( . comment( let c1, _ ) , . comment( let c2, _ ) )
1226
+ case ( . comment( let c1) , . comment( let c2) )
1225
1227
where c1. kind == . docLine && c2. kind == . docLine:
1226
1228
var newComment = c1
1227
1229
newComment. addText ( c2. text)
1228
- tokens [ tokens. count - 1 ] = . comment( newComment, hasTrailingSpace : false )
1230
+ tokens [ tokens. count - 1 ] = . comment( newComment)
1229
1231
return
1230
1232
default :
1231
1233
break
@@ -1242,52 +1244,49 @@ private final class TokenStreamCreator: SyntaxVisitor {
1242
1244
return true
1243
1245
}
1244
1246
1245
- private func breakDownTrivia( _ trivia: Trivia , before: TokenSyntax ? = nil ) {
1247
+ private func extractTrailingLineComment( _ token: TokenSyntax ) {
1248
+ guard let nextToken = token. nextToken else {
1249
+ return
1250
+ }
1251
+ let trivia = nextToken. leadingTrivia
1246
1252
for (offset, piece) in trivia. enumerated ( ) {
1247
1253
switch piece {
1248
1254
case . lineComment( let text) :
1249
- appendToken ( . comment( Comment ( kind: . line, text: text) , hasTrailingSpace: false ) )
1250
- if case . newlines? = trivia [ safe: offset + 1 ] ,
1251
- case . lineComment? = trivia [ safe: offset + 2 ] {
1252
- /* do nothing */
1255
+ if offset > 0 , case . newlines? = trivia [ safe: offset - 1 ] {
1256
+ return
1253
1257
} else {
1258
+ appendToken ( . break( size: 2 , offset: 2 ) )
1259
+ appendToken ( . comment( Comment ( kind: . line, text: text) ) )
1260
+ if let parent = nextToken. parent? . parent, !( parent is CodeBlockItemSyntax ) {
1261
+ appendToken ( . newline)
1262
+ }
1263
+ return
1264
+ }
1265
+ default :
1266
+ break
1267
+ }
1268
+ }
1269
+ }
1270
+
1271
+ private func extractTrivia( _ trivia: Trivia , fileStart: Bool = false ) {
1272
+ for (offset, piece) in trivia. enumerated ( ) {
1273
+ switch piece {
1274
+ case . lineComment( let text) :
1275
+ if fileStart {
1276
+ appendToken ( . comment( Comment ( kind: . line, text: text) ) )
1277
+ appendToken ( . newline)
1278
+ } else if offset > 0 , case . newlines? = trivia [ safe: offset - 1 ] {
1279
+ appendToken ( . comment( Comment ( kind: . line, text: text) ) )
1254
1280
appendToken ( . newline)
1255
1281
}
1256
1282
case . docLineComment( let text) :
1257
- appendToken ( . comment( Comment ( kind: . docLine, text: text) , hasTrailingSpace : false ) )
1283
+ appendToken ( . comment( Comment ( kind: . docLine, text: text) ) )
1258
1284
if case . newlines? = trivia [ safe: offset + 1 ] ,
1259
1285
case . docLineComment? = trivia [ safe: offset + 2 ] {
1260
1286
/* do nothing */
1261
1287
} else {
1262
1288
appendToken ( . newline)
1263
1289
}
1264
- case . blockComment( let text) , . docBlockComment( let text) :
1265
- var hasTrailingSpace = false
1266
- var hasTrailingNewline = false
1267
-
1268
- // Detect if a newline or trailing space comes after this comment and preserve it.
1269
- if let next = trivia [ safe: offset + 1 ] {
1270
- switch next {
1271
- case . newlines, . carriageReturns, . carriageReturnLineFeeds:
1272
- hasTrailingNewline = true
1273
- case . spaces, . tabs:
1274
- hasTrailingSpace = true
1275
- default :
1276
- break
1277
- }
1278
- }
1279
-
1280
- let commentKind : Comment . Kind
1281
- if case . blockComment = piece {
1282
- commentKind = . block
1283
- } else {
1284
- commentKind = . docBlock
1285
- }
1286
- let comment = Comment ( kind: commentKind, text: text)
1287
- appendToken ( . comment( comment, hasTrailingSpace: hasTrailingSpace) )
1288
- if hasTrailingNewline {
1289
- appendToken ( . newline)
1290
- }
1291
1290
case . newlines( let n) , . carriageReturns( let n) , . carriageReturnLineFeeds( let n) :
1292
1291
if n > 1 {
1293
1292
appendToken ( . newlines( min ( n - 1 , config. maximumBlankLines) , offset: 0 ) )
0 commit comments