@@ -1205,27 +1205,29 @@ private final class TokenStreamCreator: SyntaxVisitor {
12051205 }
12061206
12071207 override func visit( _ token: TokenSyntax ) {
1208- breakDownTrivia ( token. leadingTrivia, before: token)
1208+ let fileStart = token. previousToken == nil
1209+ extractTrivia ( token. leadingTrivia, fileStart: fileStart)
12091210 if let before = beforeMap [ token] {
12101211 tokens += before
12111212 }
12121213 appendToken ( . syntax( token) )
1214+ extractTrailingLineComment ( token)
12131215 if let afterGroups = afterMap [ token] {
12141216 for after in afterGroups. reversed ( ) {
12151217 tokens += after
12161218 }
12171219 }
1218- breakDownTrivia ( token. trailingTrivia)
1220+ extractTrivia ( token. trailingTrivia)
12191221 }
12201222
12211223 func appendToken( _ token: Token ) {
12221224 if let last = tokens. last {
12231225 switch ( last, token) {
1224- case ( . comment( let c1, _ ) , . comment( let c2, _ ) )
1226+ case ( . comment( let c1) , . comment( let c2) )
12251227 where c1. kind == . docLine && c2. kind == . docLine:
12261228 var newComment = c1
12271229 newComment. addText ( c2. text)
1228- tokens [ tokens. count - 1 ] = . comment( newComment, hasTrailingSpace : false )
1230+ tokens [ tokens. count - 1 ] = . comment( newComment)
12291231 return
12301232 default :
12311233 break
@@ -1242,52 +1244,49 @@ private final class TokenStreamCreator: SyntaxVisitor {
12421244 return true
12431245 }
12441246
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
12461252 for (offset, piece) in trivia. enumerated ( ) {
12471253 switch piece {
12481254 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
12531257 } 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) ) )
12541280 appendToken ( . newline)
12551281 }
12561282 case . docLineComment( let text) :
1257- appendToken ( . comment( Comment ( kind: . docLine, text: text) , hasTrailingSpace : false ) )
1283+ appendToken ( . comment( Comment ( kind: . docLine, text: text) ) )
12581284 if case . newlines? = trivia [ safe: offset + 1 ] ,
12591285 case . docLineComment? = trivia [ safe: offset + 2 ] {
12601286 /* do nothing */
12611287 } else {
12621288 appendToken ( . newline)
12631289 }
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- }
12911290 case . newlines( let n) , . carriageReturns( let n) , . carriageReturnLineFeeds( let n) :
12921291 if n > 1 {
12931292 appendToken ( . newlines( min ( n - 1 , config. maximumBlankLines) , offset: 0 ) )
0 commit comments