Skip to content

Commit 96d2073

Browse files
committed
Expose RawSyntaxTokenView and RawSyntaxLayoutView as SPI
1 parent 41dafda commit 96d2073

File tree

9 files changed

+733
-368
lines changed

9 files changed

+733
-368
lines changed

Sources/SwiftSyntax/Raw/RawSyntax.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
typealias RawSyntaxBuffer = UnsafeBufferPointer<RawSyntax?>
13+
@_spi(RawSyntax) public typealias RawSyntaxBuffer = UnsafeBufferPointer<RawSyntax?>
1414
typealias RawTriviaPieceBuffer = UnsafeBufferPointer<RawTriviaPiece>
1515

1616
fileprivate extension SyntaxKind {
@@ -148,7 +148,8 @@ extension RawSyntax {
148148
}
149149

150150
/// Whether or not this node is a token one.
151-
var isToken: Bool {
151+
@_spi(RawSyntax)
152+
public var isToken: Bool {
152153
kind == .token
153154
}
154155

@@ -171,7 +172,7 @@ extension RawSyntax {
171172
}
172173
return recursiveFlags
173174
case .layout(let layoutView):
174-
return layoutView.layoutData.recursiveFlags
175+
return layoutView.recursiveFlags
175176
}
176177
}
177178

Sources/SwiftSyntax/Raw/RawSyntaxLayoutView.swift

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
extension RawSyntax {
1414
/// A view into the `RawSyntax` that exposes functionality that's specific to layout nodes.
1515
/// The token's payload must be a layout, otherwise this traps.
16-
var layoutView: RawSyntaxLayoutView? {
16+
@_spi(RawSyntax)
17+
public var layoutView: RawSyntaxLayoutView? {
1718
switch raw.payload {
1819
case .parsedToken, .materializedToken:
1920
return nil
@@ -24,7 +25,8 @@ extension RawSyntax {
2425
}
2526

2627
/// A view into `RawSyntax` that exposes functionality that only applies to layout nodes.
27-
struct RawSyntaxLayoutView {
28+
@_spi(RawSyntax)
29+
public struct RawSyntaxLayoutView {
2830
private let raw: RawSyntax
2931

3032
fileprivate init(raw: RawSyntax) {
@@ -37,7 +39,7 @@ struct RawSyntaxLayoutView {
3739
}
3840
}
3941

40-
var layoutData: RawSyntaxData.Layout {
42+
private var layoutData: RawSyntaxData.Layout {
4143
switch raw.rawData.payload {
4244
case .parsedToken(_),
4345
.materializedToken(_):
@@ -47,8 +49,13 @@ struct RawSyntaxLayoutView {
4749
}
4850
}
4951

52+
var recursiveFlags: RecursiveRawSyntaxFlags {
53+
return layoutData.recursiveFlags
54+
}
55+
5056
/// Creates a new node of the same kind but with children replaced by `elements`.
51-
func replacingLayout<C: Collection>(
57+
@_spi(RawSyntax)
58+
public func replacingLayout<C: Collection>(
5259
with elements: C,
5360
arena: SyntaxArena
5461
) -> RawSyntax where C.Element == RawSyntax? {
@@ -60,7 +67,8 @@ struct RawSyntaxLayoutView {
6067
}
6168
}
6269

63-
func insertingChild(
70+
@_spi(RawSyntax)
71+
public func insertingChild(
6472
_ newChild: RawSyntax?,
6573
at index: Int,
6674
arena: SyntaxArena
@@ -78,7 +86,8 @@ struct RawSyntaxLayoutView {
7886
}
7987
}
8088

81-
func removingChild(
89+
@_spi(RawSyntax)
90+
public func removingChild(
8291
at index: Int,
8392
arena: SyntaxArena
8493
) -> RawSyntax {
@@ -101,11 +110,13 @@ struct RawSyntaxLayoutView {
101110
}
102111
}
103112

104-
func appending(_ newChild: RawSyntax?, arena: SyntaxArena) -> RawSyntax {
113+
@_spi(RawSyntax)
114+
public func appending(_ newChild: RawSyntax?, arena: SyntaxArena) -> RawSyntax {
105115
insertingChild(newChild, at: children.count, arena: arena)
106116
}
107117

108-
func replacingChildSubrange<C: Collection>(
118+
@_spi(RawSyntax)
119+
public func replacingChildSubrange<C: Collection>(
109120
_ range: Range<Int>,
110121
with elements: C,
111122
arena: SyntaxArena
@@ -130,7 +141,8 @@ struct RawSyntaxLayoutView {
130141
}
131142
}
132143

133-
func replacingChild(
144+
@_spi(RawSyntax)
145+
public func replacingChild(
134146
at index: Int,
135147
with newChild: RawSyntax?,
136148
arena: SyntaxArena
@@ -144,17 +156,20 @@ struct RawSyntaxLayoutView {
144156
}
145157
}
146158

147-
func formLayoutArray() -> [RawSyntax?] {
159+
@_spi(RawSyntax)
160+
public func formLayoutArray() -> [RawSyntax?] {
148161
Array(children)
149162
}
150163

151164
/// Child nodes.
152-
var children: RawSyntaxBuffer {
165+
@_spi(RawSyntax)
166+
public var children: RawSyntaxBuffer {
153167
layoutData.layout
154168
}
155169

156170
/// The number of children, `present` or `missing`, in this node.
157-
var numberOfChildren: Int {
171+
@_spi(RawSyntax)
172+
public var numberOfChildren: Int {
158173
return children.count
159174
}
160175
}

Sources/SwiftSyntax/Raw/RawSyntaxNodeProtocol.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ extension RawSyntax: RawSyntaxNodeProtocol {
6868
public struct RawTokenSyntax: RawSyntaxToSyntax, RawSyntaxNodeProtocol {
6969
public typealias SyntaxType = TokenSyntax
7070

71-
var tokenView: RawSyntaxTokenView {
71+
@_spi(RawSyntax)
72+
public var tokenView: RawSyntaxTokenView {
7273
return raw.tokenView!
7374
}
7475

Sources/SwiftSyntax/Raw/RawSyntaxNodes.swift.gyb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ public protocol Raw${node.name}NodeProtocol: Raw${node.base_type}NodeProtocol {}
3131
public struct Raw${node.name}: Raw${node.name if node.is_base() else node.base_type}NodeProtocol, RawSyntaxToSyntax {
3232
public typealias SyntaxType = ${node.name}
3333

34-
var layoutView: RawSyntaxLayoutView {
34+
@_spi(RawSyntax)
35+
public var layoutView: RawSyntaxLayoutView {
3536
return raw.layoutView!
3637
}
3738

Sources/SwiftSyntax/Raw/RawSyntaxTokenView.swift

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
extension RawSyntax {
1414
/// A view into the `RawSyntax` that exposes functionality that's specific to tokens.
1515
/// The token's payload must be a token, otherwise this traps.
16-
var tokenView: RawSyntaxTokenView? {
16+
@_spi(RawSyntax)
17+
public var tokenView: RawSyntaxTokenView? {
1718
switch raw.payload {
1819
case .parsedToken, .materializedToken:
1920
return RawSyntaxTokenView(raw: self)
@@ -24,7 +25,8 @@ extension RawSyntax {
2425
}
2526

2627
/// A view into `RawSyntax` that exposes functionality that only applies to tokens.
27-
struct RawSyntaxTokenView {
28+
@_spi(RawSyntax)
29+
public struct RawSyntaxTokenView {
2830
let raw: RawSyntax
2931

3032
fileprivate init(raw: RawSyntax) {
@@ -38,7 +40,8 @@ struct RawSyntaxTokenView {
3840
}
3941

4042
/// Token kind of this node.
41-
var rawKind: RawTokenKind {
43+
@_spi(RawSyntax)
44+
public var rawKind: RawTokenKind {
4245
switch raw.rawData.payload {
4346
case .materializedToken(let dat):
4447
return dat.tokenKind
@@ -50,7 +53,8 @@ struct RawSyntaxTokenView {
5053
}
5154

5255
/// Token text of this node.
53-
var rawText: SyntaxText {
56+
@_spi(RawSyntax)
57+
public var rawText: SyntaxText {
5458
switch raw.rawData.payload {
5559
case .parsedToken(let dat):
5660
return dat.tokenText
@@ -62,7 +66,8 @@ struct RawSyntaxTokenView {
6266
}
6367

6468
/// The UTF-8 byte length of the leading trivia.
65-
var leadingTriviaByteLength: Int {
69+
@_spi(RawSyntax)
70+
public var leadingTriviaByteLength: Int {
6671
switch raw.rawData.payload {
6772
case .parsedToken(let dat):
6873
return dat.leadingTriviaText.count
@@ -74,7 +79,8 @@ struct RawSyntaxTokenView {
7479
}
7580

7681
/// The UTF-8 byte length of the trailing trivia.
77-
var trailingTriviaByteLength: Int {
82+
@_spi(RawSyntax)
83+
public var trailingTriviaByteLength: Int {
7884
switch raw.rawData.payload {
7985
case .parsedToken(let dat):
8086
return dat.trailingTriviaText.count
@@ -85,7 +91,8 @@ struct RawSyntaxTokenView {
8591
}
8692
}
8793

88-
var leadingRawTriviaPieces: [RawTriviaPiece] {
94+
@_spi(RawSyntax)
95+
public var leadingRawTriviaPieces: [RawTriviaPiece] {
8996
switch raw.rawData.payload {
9097
case .parsedToken(let dat):
9198
return raw.arena.parseTrivia(source: dat.leadingTriviaText, position: .leading)
@@ -96,7 +103,8 @@ struct RawSyntaxTokenView {
96103
}
97104
}
98105

99-
var trailingRawTriviaPieces: [RawTriviaPiece] {
106+
@_spi(RawSyntax)
107+
public var trailingRawTriviaPieces: [RawTriviaPiece] {
100108
switch raw.rawData.payload {
101109
case .parsedToken(let dat):
102110
return raw.arena.parseTrivia(source: dat.trailingTriviaText, position: .trailing)
@@ -108,36 +116,42 @@ struct RawSyntaxTokenView {
108116
}
109117

110118
/// Returns the leading `Trivia` length.
111-
var leadingTriviaLength: SourceLength {
119+
@_spi(RawSyntax)
120+
public var leadingTriviaLength: SourceLength {
112121
return SourceLength(utf8Length: leadingTriviaByteLength)
113122
}
114123

115124
/// Returns the trailing `Trivia` length.
116-
var trailingTriviaLength: SourceLength {
125+
@_spi(RawSyntax)
126+
public var trailingTriviaLength: SourceLength {
117127
return SourceLength(utf8Length: trailingTriviaByteLength)
118128
}
119129

120130
/// Returns the leading `Trivia`.
121-
func formLeadingTrivia() -> Trivia {
131+
@_spi(RawSyntax)
132+
public func formLeadingTrivia() -> Trivia {
122133
return Trivia(pieces: leadingRawTriviaPieces.map({ TriviaPiece(raw: $0) }))
123134
}
124135

125136
/// Returns the trailing `Trivia`.
126137
/// - Returns: nil if called on a layout node.
127-
func formTrailingTrivia() -> Trivia {
138+
@_spi(RawSyntax)
139+
public func formTrailingTrivia() -> Trivia {
128140
return Trivia(pieces: trailingRawTriviaPieces.map({ TriviaPiece(raw: $0) }))
129141
}
130142

131143
/// Calls `body` with the token text. The token text value must not escape the closure.
132-
func withUnsafeTokenText<Result>(
144+
@_spi(RawSyntax)
145+
public func withUnsafeTokenText<Result>(
133146
_ body: (SyntaxText?) -> Result
134147
) -> Result {
135148
body(rawText)
136149
}
137150

138151
/// Returns a `RawSyntax` node with the same source text but with the token
139152
/// kind changed to `newValue`.
140-
func withKind(_ newValue: TokenKind) -> RawSyntax {
153+
@_spi(RawSyntax)
154+
public func withKind(_ newValue: TokenKind) -> RawSyntax {
141155
switch raw.rawData.payload {
142156
case .parsedToken(_):
143157
// The wholeText can't be continuous anymore. Make a materialized token.
@@ -162,7 +176,8 @@ struct RawSyntaxTokenView {
162176

163177
/// The length of the token without leading or trailing trivia, assuming this
164178
/// is a token node.
165-
var textByteLength: Int {
179+
@_spi(RawSyntax)
180+
public var textByteLength: Int {
166181
switch raw.rawData.payload {
167182
case .parsedToken(let dat):
168183
return dat.tokenText.count
@@ -173,11 +188,13 @@ struct RawSyntaxTokenView {
173188
}
174189
}
175190

176-
var contentLength: SourceLength {
191+
@_spi(RawSyntax)
192+
public var contentLength: SourceLength {
177193
SourceLength(utf8Length: textByteLength)
178194
}
179195

180-
func formKind() -> TokenKind {
196+
@_spi(RawSyntax)
197+
public func formKind() -> TokenKind {
181198
switch raw.rawData.payload {
182199
case .parsedToken(let dat):
183200
return TokenKind.fromRaw(kind: dat.tokenKind, text: String(syntaxText: dat.tokenText))
@@ -188,7 +205,8 @@ struct RawSyntaxTokenView {
188205
}
189206
}
190207

191-
var presence: SourcePresence {
208+
@_spi(RawSyntax)
209+
public var presence: SourcePresence {
192210
switch raw.rawData.payload {
193211
case .parsedToken(let dat):
194212
return dat.presence
@@ -198,5 +216,4 @@ struct RawSyntaxTokenView {
198216
preconditionFailure("'presence' is a token-only property")
199217
}
200218
}
201-
202219
}

0 commit comments

Comments
 (0)