@@ -85,15 +85,17 @@ open class SyntaxRewriter {
85
85
private func visitImpl${ node. name} ( _ data: SyntaxData) - > Syntax {
86
86
% if node. is_base ( ) :
87
87
let node = Unknown ${ node. name} ( data)
88
- visitPre ( Syntax ( node) )
89
- defer { visitPost ( Syntax ( node) ) }
90
- if let newNode = visitAny ( Syntax ( node) ) { return newNode }
88
+ // Accessing _syntaxNode directly is faster than calling Syntax(node)
89
+ visitPre ( node. _syntaxNode)
90
+ defer { visitPost ( node. _syntaxNode) }
91
+ if let newNode = visitAny ( node. _syntaxNode) { return newNode }
91
92
return Syntax ( visit ( node) )
92
93
% else :
93
94
let node = ${ node. name} ( data)
94
- visitPre ( Syntax ( node) )
95
- defer { visitPost ( Syntax ( node) ) }
96
- if let newNode = visitAny ( Syntax ( node) ) { return newNode }
95
+ // Accessing _syntaxNode directly is faster than calling Syntax(node)
96
+ visitPre ( node. _syntaxNode)
97
+ defer { visitPost ( node. _syntaxNode) }
98
+ if let newNode = visitAny ( node. _syntaxNode) { return newNode }
97
99
% if node. base_type == 'Syntax':
98
100
return visit ( node)
99
101
% else:
@@ -108,15 +110,17 @@ open class SyntaxRewriter {
108
110
switch data. raw. kind {
109
111
case . token:
110
112
let node = TokenSyntax ( data)
111
- visitPre ( Syntax ( node) )
112
- defer { visitPost ( Syntax ( node) ) }
113
- if let newNode = visitAny ( Syntax ( node) ) { return newNode }
113
+ // Accessing _syntaxNode directly is faster than calling Syntax(node)
114
+ visitPre ( node. _syntaxNode)
115
+ defer { visitPost ( node. _syntaxNode) }
116
+ if let newNode = visitAny ( node. _syntaxNode) { return newNode }
114
117
return visit ( node)
115
118
case . unknown:
116
119
let node = UnknownSyntax ( data)
117
- visitPre ( Syntax ( node) )
118
- defer { visitPost ( Syntax ( node) ) }
119
- if let newNode = visitAny ( Syntax ( node) ) { return newNode }
120
+ // Accessing _syntaxNode directly is faster than calling Syntax(node)
121
+ visitPre ( node. _syntaxNode)
122
+ defer { visitPost ( node. _syntaxNode) }
123
+ if let newNode = visitAny ( node. _syntaxNode) { return newNode }
120
124
return visit ( node)
121
125
// The implementation of every generated case goes into its own function. This
122
126
// circumvents an issue where the compiler allocates stack space for every
@@ -142,7 +146,12 @@ open class SyntaxRewriter {
142
146
// nodes are being collected.
143
147
var newLayout : ContiguousArray < RawSyntax ? > ?
144
148
145
- for (i, ( raw, info) ) in RawSyntaxChildren ( Syntax ( node) ) . enumerated ( ) {
149
+ let parentBox = SyntaxBox ( Syntax ( node) )
150
+
151
+ // Incrementing i manually is faster than using .enumerated()
152
+ var childIndex = 0
153
+ for (raw, info) in RawSyntaxChildren ( Syntax ( node) ) {
154
+ defer { childIndex += 1 }
146
155
guard let child = raw else {
147
156
// Node does not exist. If we are collecting rewritten nodes, we need to
148
157
// collect this one as well, otherwise we can ignore it.
@@ -154,7 +163,7 @@ open class SyntaxRewriter {
154
163
155
164
// Build the Syntax node to rewrite
156
165
let absoluteRaw = AbsoluteRawSyntax ( raw: child, info: info)
157
- let data = SyntaxData ( absoluteRaw, parent : Syntax ( node ) )
166
+ let data = SyntaxData ( absoluteRaw, parentBox : parentBox )
158
167
159
168
let rewritten = visit ( data)
160
169
if rewritten. data. nodeId != info. nodeId {
@@ -168,7 +177,7 @@ open class SyntaxRewriter {
168
177
// reserves enough capacity for the entire layout.
169
178
newLayout = ContiguousArray < RawSyntax ? > ( )
170
179
newLayout!. reserveCapacity ( node. raw. numberOfChildren)
171
- for j in 0 ..< i {
180
+ for j in 0 ..< childIndex {
172
181
newLayout!. append ( node. raw. child ( at: j) )
173
182
}
174
183
}
0 commit comments