Skip to content

Commit cb3f64d

Browse files
authored
Merge pull request swiftlang#1477 from bnbarham/empty-trivia
Make leading/trailing trivia required fields
2 parents fb9d8d2 + 4d2212c commit cb3f64d

File tree

10 files changed

+29
-51
lines changed

10 files changed

+29
-51
lines changed

Sources/SwiftParserDiagnostics/DiagnosticExtensions.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ extension FixIt.Changes {
9696
),
9797
.replaceLeadingTrivia(token: nextToken, newTrivia: []),
9898
]
99-
} else if node.leadingTrivia?.isEmpty ?? true,
99+
} else if node.leadingTrivia.isEmpty,
100100
let previousToken = node.previousToken(viewMode: .fixedUp),
101101
previousToken.presence == .present,
102102
previousToken.trailingTrivia.isEmpty,

Sources/SwiftParserDiagnostics/ParseDiagnosticsGenerator.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
821821
message: RemoveNodesFixIt(unexpectedName),
822822
changes: [
823823
.makeMissing(unexpectedName),
824-
FixIt.Changes(changes: [.replaceTrailingTrivia(token: previous, newTrivia: .zero)]),
824+
FixIt.Changes(changes: [.replaceTrailingTrivia(token: previous, newTrivia: [])]),
825825
]
826826
)
827827
],
@@ -1008,7 +1008,7 @@ public class ParseDiagnosticsGenerator: SyntaxAnyVisitor {
10081008
message: ReplaceTokensFixIt(replaceTokens: [singleQuote], replacement: node.openQuote),
10091009
changes: [
10101010
.makeMissing(singleQuote, transferTrivia: false),
1011-
.makePresent(node.openQuote, leadingTrivia: singleQuote.leadingTrivia ?? []),
1011+
.makePresent(node.openQuote, leadingTrivia: singleQuote.leadingTrivia),
10121012
.makeMissing(node.unexpectedBetweenSegmentsAndCloseQuote, transferTrivia: false),
10131013
.makePresent(node.closeQuote, trailingTrivia: node.unexpectedBetweenSegmentsAndCloseQuote?.trailingTrivia ?? []),
10141014
]

Sources/SwiftSyntax/Raw/RawSyntax.swift

+4-4
Original file line numberDiff line numberDiff line change
@@ -474,12 +474,12 @@ extension RawSyntax {
474474
}
475475
}
476476

477-
func formLeadingTrivia() -> Trivia? {
478-
firstToken(viewMode: .sourceAccurate)?.formLeadingTrivia()
477+
func formLeadingTrivia() -> Trivia {
478+
firstToken(viewMode: .sourceAccurate)?.formLeadingTrivia() ?? []
479479
}
480480

481-
func formTrailingTrivia() -> Trivia? {
482-
lastToken(viewMode: .sourceAccurate)?.formTrailingTrivia()
481+
func formTrailingTrivia() -> Trivia {
482+
lastToken(viewMode: .sourceAccurate)?.formTrailingTrivia() ?? []
483483
}
484484
}
485485

Sources/SwiftSyntax/Syntax.swift

+7-7
Original file line numberDiff line numberDiff line change
@@ -471,24 +471,24 @@ public extension SyntaxProtocol {
471471
/// The leading trivia of this syntax node. Leading trivia is attached to
472472
/// the first token syntax contained by this node. Without such token, this
473473
/// property will return nil.
474-
var leadingTrivia: Trivia? {
474+
var leadingTrivia: Trivia {
475475
get {
476476
return raw.formLeadingTrivia()
477477
}
478478
set {
479-
self = Self(Syntax(data.withLeadingTrivia(newValue ?? [], arena: SyntaxArena())))!
479+
self = Self(Syntax(data.withLeadingTrivia(newValue, arena: SyntaxArena())))!
480480
}
481481
}
482482

483483
/// The trailing trivia of this syntax node. Trailing trivia is attached to
484484
/// the last token syntax contained by this node. Without such token, this
485485
/// property will return nil.
486-
var trailingTrivia: Trivia? {
486+
var trailingTrivia: Trivia {
487487
get {
488488
return raw.formTrailingTrivia()
489489
}
490490
set {
491-
self = Self(Syntax(data.withTrailingTrivia(newValue ?? [], arena: SyntaxArena())))!
491+
self = Self(Syntax(data.withTrailingTrivia(newValue, arena: SyntaxArena())))!
492492
}
493493
}
494494

@@ -510,7 +510,7 @@ public extension SyntaxProtocol {
510510
/// When isImplicit is true, the syntax node doesn't include any
511511
/// underlying tokens, e.g. an empty CodeBlockItemList.
512512
var isImplicit: Bool {
513-
return leadingTrivia == nil
513+
return raw.isEmpty
514514
}
515515

516516
/// The textual byte length of this node exluding leading and trailing trivia.
@@ -636,10 +636,10 @@ public extension SyntaxProtocol {
636636
if let token = Syntax(self).as(TokenSyntax.self) {
637637
target.write(String(describing: token.tokenKind))
638638
if includeTrivia {
639-
if let leadingTrivia = leadingTrivia, !leadingTrivia.isEmpty {
639+
if !leadingTrivia.isEmpty {
640640
target.write(" leadingTrivia=\(leadingTrivia.debugDescription)")
641641
}
642-
if let trailingTrivia = trailingTrivia, !trailingTrivia.isEmpty {
642+
if !trailingTrivia.isEmpty {
643643
target.write(" trailingTrivia=\(trailingTrivia.debugDescription)")
644644
}
645645
}

Sources/SwiftSyntax/generated/Trivia.swift

-5
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,6 @@ public struct Trivia {
165165
self.pieces = Array(pieces)
166166
}
167167

168-
/// Creates Trivia with no pieces.
169-
public static var zero: Trivia {
170-
return Trivia(pieces: [])
171-
}
172-
173168
/// Whether the Trivia contains no pieces.
174169
public var isEmpty: Bool {
175170
pieces.isEmpty

Sources/_SwiftSyntaxTestSupport/SyntaxProtocol+Initializer.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ private class InitializerExprFormat: BasicFormat {
2323
self.visit($0).as(SyntaxType.self)!
2424
}
2525
formattedChildren = formattedChildren.map {
26-
if $0.leadingTrivia?.first?.isNewline == true {
26+
if $0.leadingTrivia.first?.isNewline == true {
2727
return $0
2828
} else {
29-
return $0.with(\.leadingTrivia, indentedNewline + ($0.leadingTrivia ?? []))
29+
return $0.with(\.leadingTrivia, indentedNewline + $0.leadingTrivia)
3030
}
3131
}
3232
indentationLevel -= 1

Tests/SwiftSyntaxBuilderTest/StringInterpolationTests.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,8 @@ final class StringInterpolationTests: XCTestCase {
230230
class Rewriter: SyntaxRewriter {
231231
override func visit(_ node: FunctionDeclSyntax) -> DeclSyntax {
232232
let newFunc = DeclSyntax("func newName() {}")
233-
.with(\.leadingTrivia, node.leadingTrivia!)
234-
.with(\.trailingTrivia, node.trailingTrivia!)
233+
.with(\.leadingTrivia, node.leadingTrivia)
234+
.with(\.trailingTrivia, node.trailingTrivia)
235235
return DeclSyntax(newFunc)
236236
}
237237
}

Tests/SwiftSyntaxMacrosTest/MacroSystemTests.swift

+5-22
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,7 @@ public struct ColorLiteralMacro: ExpressionMacro {
7575
with: "_colorLiteralRed"
7676
)
7777
let initSyntax: ExprSyntax = ".init(\(argList))"
78-
if let leadingTrivia = macro.leadingTrivia {
79-
return initSyntax.with(\.leadingTrivia, leadingTrivia)
80-
}
81-
return initSyntax
78+
return initSyntax.with(\.leadingTrivia, macro.leadingTrivia)
8279
}
8380
}
8481

@@ -95,10 +92,7 @@ public struct FileLiteralMacro: ExpressionMacro {
9592
with: "fileReferenceLiteralResourceName"
9693
)
9794
let initSyntax: ExprSyntax = ".init(\(argList))"
98-
if let leadingTrivia = macro.leadingTrivia {
99-
return initSyntax.with(\.leadingTrivia, leadingTrivia)
100-
}
101-
return initSyntax
95+
return initSyntax.with(\.leadingTrivia, macro.leadingTrivia)
10296
}
10397
}
10498

@@ -115,10 +109,7 @@ public struct ImageLiteralMacro: ExpressionMacro {
115109
with: "imageLiteralResourceName"
116110
)
117111
let initSyntax: ExprSyntax = ".init(\(argList))"
118-
if let leadingTrivia = macro.leadingTrivia {
119-
return initSyntax.with(\.leadingTrivia, leadingTrivia)
120-
}
121-
return initSyntax
112+
return initSyntax.with(\.leadingTrivia, macro.leadingTrivia)
122113
}
123114
}
124115

@@ -134,11 +125,7 @@ public struct ColumnMacro: ExpressionMacro {
134125
else {
135126
throw CustomError.message("can't find location for macro")
136127
}
137-
138-
if let leadingTrivia = macro.leadingTrivia {
139-
return sourceLoc.column.with(\.leadingTrivia, leadingTrivia)
140-
}
141-
return sourceLoc.column
128+
return sourceLoc.column.with(\.leadingTrivia, macro.leadingTrivia)
142129
}
143130
}
144131

@@ -154,11 +141,7 @@ public struct FileIDMacro: ExpressionMacro {
154141
else {
155142
throw CustomError.message("can't find location for macro")
156143
}
157-
158-
if let leadingTrivia = macro.leadingTrivia {
159-
return sourceLoc.file.with(\.leadingTrivia, leadingTrivia)
160-
}
161-
return sourceLoc.file
144+
return sourceLoc.file.with(\.leadingTrivia, macro.leadingTrivia)
162145
}
163146
}
164147

Tests/SwiftSyntaxParserTest/AbsolutePositionTests.swift

+5-5
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,14 @@ public class AbsolutePositionTests: XCTestCase {
149149
public func testTrivias() {
150150
let idx = 5
151151
let root = self.createSourceFile(idx + 1)
152-
XCTAssertEqual(3, root.leadingTrivia!.count)
153-
XCTAssertEqual(0, root.trailingTrivia!.count)
152+
XCTAssertEqual(3, root.leadingTrivia.count)
153+
XCTAssertEqual(0, root.trailingTrivia.count)
154154
let state = root.statements[idx]
155-
XCTAssertEqual(3, state.leadingTrivia!.count)
156-
XCTAssertEqual(2, state.trailingTrivia!.count)
155+
XCTAssertEqual(3, state.leadingTrivia.count)
156+
XCTAssertEqual(2, state.trailingTrivia.count)
157157
XCTAssertEqual(
158158
state.byteSize,
159-
state.leadingTrivia!.byteSize + state.trailingTrivia!.byteSize
159+
state.leadingTrivia.byteSize + state.trailingTrivia.byteSize
160160
+ state.byteSizeAfterTrimmingTrivia
161161
)
162162
XCTAssertFalse(root.statements.isImplicit)

Tests/SwiftSyntaxParserTest/SyntaxVisitorTests.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public class SyntaxVisitorTests: XCTestCase {
122122
public func testRewriteTrivia() {
123123
class TriviaRemover: SyntaxRewriter {
124124
override func visit(_ token: TokenSyntax) -> TokenSyntax {
125-
return token.with(\.trailingTrivia, .zero)
125+
return token.with(\.trailingTrivia, [])
126126
}
127127
}
128128

0 commit comments

Comments
 (0)