Skip to content

Commit 74e9a89

Browse files
committed
Simplify SyntaxRewriter
1 parent a47eec9 commit 74e9a89

File tree

2 files changed

+1130
-4430
lines changed

2 files changed

+1130
-4430
lines changed

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntax/SyntaxRewriterFile.swift

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -161,31 +161,24 @@ let syntaxRewriterFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
161161
)
162162
}
163163

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-
180164
DeclSyntax(
181165
"""
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)
185174
// Accessing _syntaxNode directly is faster than calling Syntax(node)
186175
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+
}
189182
return Syntax(visit(node))
190183
}
191184
"""
@@ -232,12 +225,12 @@ let syntaxRewriterFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
232225
) {
233226
try SwitchExprSyntax("switch data.raw.kind") {
234227
SwitchCaseSyntax("case .token:") {
235-
StmtSyntax("return visitImplTokenSyntax")
228+
StmtSyntax("return { self.visitImpl($0, TokenSyntax.self, self.visit) }")
236229
}
237230

238231
for node in NON_BASE_SYNTAX_NODES {
239232
SwitchCaseSyntax("case .\(node.varOrCaseName):") {
240-
StmtSyntax("return visitImpl\(node.kind.syntaxType)")
233+
StmtSyntax("return { self.visitImpl($0, \(node.kind.syntaxType).self, self.visit) }")
241234
}
242235
}
243236
}
@@ -260,12 +253,12 @@ let syntaxRewriterFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
260253
try! FunctionDeclSyntax("private func visit(_ data: SyntaxData) -> Syntax") {
261254
try SwitchExprSyntax("switch data.raw.kind") {
262255
SwitchCaseSyntax("case .token:") {
263-
StmtSyntax("return visitImplTokenSyntax(data)")
256+
StmtSyntax("return visitImpl(data, TokenSyntax.self, visit)")
264257
}
265258

266259
for node in NON_BASE_SYNTAX_NODES {
267260
SwitchCaseSyntax("case .\(node.varOrCaseName):") {
268-
StmtSyntax("return visitImpl\(node.kind.syntaxType)(data)")
261+
StmtSyntax("return visitImpl(data, \(node.kind.syntaxType).self, visit)")
269262
}
270263
}
271264
}

0 commit comments

Comments
 (0)