Skip to content

Commit ac894cd

Browse files
committed
Fix leading trivia is not applied if raw syntax is empty
1 parent b12be78 commit ac894cd

File tree

4 files changed

+29
-14
lines changed

4 files changed

+29
-14
lines changed

Sources/SwiftSyntax/RawSyntax.swift

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,7 +1113,11 @@ final class RawSyntax: ManagedBuffer<RawSyntaxBase, RawSyntaxDataElement> {
11131113
}
11141114
}
11151115

1116-
func withLeadingTrivia(_ leadingTrivia: Trivia) -> RawSyntax {
1116+
/// Replaces the leading trivia of the first token in this syntax tree by `leadingTrivia`.
1117+
/// If the syntax tree did not contain a token and thus no trivia could be attached to it, `nil` is returned.
1118+
/// - Parameters:
1119+
/// - leadingTrivia: The trivia to attach.
1120+
func withLeadingTrivia(_ leadingTrivia: Trivia) -> RawSyntax? {
11171121
if isToken {
11181122
return RawSyntax.createAndCalcLength(
11191123
kind: formTokenKind()!,
@@ -1123,16 +1127,20 @@ final class RawSyntax: ManagedBuffer<RawSyntaxBase, RawSyntaxDataElement> {
11231127
} else {
11241128
var layout = formLayoutArray()
11251129
for (index, raw) in layout.enumerated() {
1126-
if let raw = raw {
1127-
layout[index] = raw.withLeadingTrivia(leadingTrivia)
1130+
if let raw = raw, let newRaw = raw.withLeadingTrivia(leadingTrivia) {
1131+
layout[index] = newRaw
11281132
return replacingLayout(layout)
11291133
}
11301134
}
1131-
return self
1135+
return nil
11321136
}
11331137
}
11341138

1135-
func withTrailingTrivia(_ trailingTrivia: Trivia) -> RawSyntax {
1139+
/// Replaces the trailing trivia of the first token in this syntax tree by `trailingTrivia`.
1140+
/// If the syntax tree did not contain a token and thus no trivia could be attached to it, `nil` is returned.
1141+
/// - Parameters:
1142+
/// - trailingTrivia: The trivia to attach.
1143+
func withTrailingTrivia(_ trailingTrivia: Trivia) -> RawSyntax? {
11361144
if isToken {
11371145
return RawSyntax.createAndCalcLength(
11381146
kind: formTokenKind()!,
@@ -1142,12 +1150,12 @@ final class RawSyntax: ManagedBuffer<RawSyntaxBase, RawSyntaxDataElement> {
11421150
} else {
11431151
var layout = formLayoutArray()
11441152
for (index, raw) in layout.enumerated().reversed() {
1145-
if let raw = raw {
1146-
layout[index] = raw.withTrailingTrivia(trailingTrivia)
1153+
if let raw = raw, let newRaw = raw.withTrailingTrivia(trailingTrivia) {
1154+
layout[index] = newRaw
11471155
return replacingLayout(layout)
11481156
}
11491157
}
1150-
return self
1158+
return nil
11511159
}
11521160
}
11531161

Sources/SwiftSyntax/SyntaxData.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,10 +356,18 @@ struct SyntaxData {
356356
}
357357

358358
func withLeadingTrivia(_ leadingTrivia: Trivia) -> SyntaxData {
359-
return replacingSelf(raw.withLeadingTrivia(leadingTrivia))
359+
if let raw = raw.withLeadingTrivia(leadingTrivia) {
360+
return replacingSelf(raw)
361+
} else {
362+
return self
363+
}
360364
}
361365

362366
func withTrailingTrivia(_ trailingTrivia: Trivia) -> SyntaxData {
363-
return replacingSelf(raw.withTrailingTrivia(trailingTrivia))
367+
if let raw = raw.withTrailingTrivia(trailingTrivia) {
368+
return replacingSelf(raw)
369+
} else {
370+
return self
371+
}
364372
}
365373
}

Tests/SwiftSyntaxBuilderTest/FunctionTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ final class FunctionTests: XCTestCase {
5252
let syntax = buildable.buildSyntax(format: Format(), leadingTrivia: leadingTrivia)
5353

5454
XCTAssertEqual(syntax.description, """
55-
func fibonacci(_ n: Int)-> Int{
55+
func fibonacci(_ n: Int)-> Int{
5656
if n <= 1{
5757
return n
5858
}

Tests/SwiftSyntaxBuilderTest/ProtocolDeclTests.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ final class ProtocolDeclTests: XCTestCase {
1212
let functionSignature = FunctionSignature(input: input, output: returnType)
1313

1414
let buildable = ProtocolDecl(identifier: "DeclListBuildable", attributesBuilder: { TokenSyntax.public }, membersBuilder: {
15-
// FIXME: We need to add the `modifiersBuilder` with a non-empty value, otherwise will the builder omit newline.
16-
FunctionDecl(identifier: .identifier("buildDeclList"), signature: functionSignature, body: nil, modifiersBuilder: { TokenSyntax.public })
15+
FunctionDecl(identifier: .identifier("buildDeclList"), signature: functionSignature, body: nil, modifiersBuilder: { })
1716
})
1817

1918
let syntax = buildable.buildSyntax(format: Format())
@@ -23,7 +22,7 @@ final class ProtocolDeclTests: XCTestCase {
2322

2423
XCTAssertEqual(text, """
2524
public protocol DeclListBuildable{
26-
public func buildDeclList(format: Format, leadingTrivia: Trivia?)-> [DeclSyntax]
25+
func buildDeclList(format: Format, leadingTrivia: Trivia?)-> [DeclSyntax]
2726
}
2827
""")
2928
}

0 commit comments

Comments
 (0)