@@ -161,31 +161,24 @@ let syntaxRewriterFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
161
161
)
162
162
}
163
163
164
- for node in NON_BASE_SYNTAX_NODES {
165
- DeclSyntax (
166
- """
167
- /// Implementation detail of visit(_:). Do not call directly.
168
- private func visitImpl \( node. kind. syntaxType) (_ data: SyntaxData) -> Syntax {
169
- let node = \( node. kind. syntaxType) (data)
170
- // Accessing _syntaxNode directly is faster than calling Syntax(node)
171
- visitPre(node._syntaxNode)
172
- defer { visitPost(node._syntaxNode) }
173
- if let newNode = visitAny(node._syntaxNode) { return newNode }
174
- return Syntax(visit(node))
175
- }
176
- """
177
- )
178
- }
179
-
180
164
DeclSyntax (
181
165
"""
182
- /// Implementation detail of visit(_:). Do not call directly.
183
- private func visitImplTokenSyntax(_ data: SyntaxData) -> Syntax {
184
- let node = TokenSyntax(data)
166
+ /// Interpret `data` as a node of type `nodeType`, visit it, calling
167
+ /// the `visit` to transform the node.
168
+ private func visitImpl<NodeType: SyntaxProtocol>(
169
+ _ data: SyntaxData,
170
+ _ nodeType: NodeType.Type,
171
+ _ visit: (NodeType) -> some SyntaxProtocol
172
+ ) -> Syntax {
173
+ let node = Syntax(data).cast(NodeType.self)
185
174
// Accessing _syntaxNode directly is faster than calling Syntax(node)
186
175
visitPre(node._syntaxNode)
187
- defer { visitPost(node._syntaxNode) }
188
- if let newNode = visitAny(node._syntaxNode) { return newNode }
176
+ defer {
177
+ visitPost(node._syntaxNode)
178
+ }
179
+ if let newNode = visitAny(node._syntaxNode) {
180
+ return newNode
181
+ }
189
182
return Syntax(visit(node))
190
183
}
191
184
"""
@@ -232,12 +225,12 @@ let syntaxRewriterFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
232
225
) {
233
226
try SwitchExprSyntax ( " switch data.raw.kind " ) {
234
227
SwitchCaseSyntax ( " case .token: " ) {
235
- StmtSyntax ( " return visitImplTokenSyntax " )
228
+ StmtSyntax ( " return { self.visitImpl($0, TokenSyntax.self, self.visit) } " )
236
229
}
237
230
238
231
for node in NON_BASE_SYNTAX_NODES {
239
232
SwitchCaseSyntax ( " case . \( node. varOrCaseName) : " ) {
240
- StmtSyntax ( " return visitImpl \( node. kind. syntaxType) " )
233
+ StmtSyntax ( " return { self. visitImpl($0, \( node. kind. syntaxType) .self, self.visit) } " )
241
234
}
242
235
}
243
236
}
@@ -260,12 +253,12 @@ let syntaxRewriterFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
260
253
try ! FunctionDeclSyntax ( " private func visit(_ data: SyntaxData) -> Syntax " ) {
261
254
try SwitchExprSyntax ( " switch data.raw.kind " ) {
262
255
SwitchCaseSyntax ( " case .token: " ) {
263
- StmtSyntax ( " return visitImplTokenSyntax (data) " )
256
+ StmtSyntax ( " return visitImpl (data, TokenSyntax.self, visit ) " )
264
257
}
265
258
266
259
for node in NON_BASE_SYNTAX_NODES {
267
260
SwitchCaseSyntax ( " case . \( node. varOrCaseName) : " ) {
268
- StmtSyntax ( " return visitImpl \( node. kind. syntaxType) (data )" )
261
+ StmtSyntax ( " return visitImpl(data, \( node. kind. syntaxType) .self, visit )" )
269
262
}
270
263
}
271
264
}
0 commit comments