@@ -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,13 @@ 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 syntaxNode = node. _syntaxNode
150
+ let parentBox = SyntaxBox ( syntaxNode)
151
+
152
+ // Incrementing i manually is faster than using .enumerated()
153
+ var childIndex = 0
154
+ for (raw, info) in RawSyntaxChildren ( Syntax ( node) ) {
155
+ defer { childIndex += 1 }
146
156
guard let child = raw else {
147
157
// Node does not exist. If we are collecting rewritten nodes, we need to
148
158
// collect this one as well, otherwise we can ignore it.
@@ -154,7 +164,7 @@ open class SyntaxRewriter {
154
164
155
165
// Build the Syntax node to rewrite
156
166
let absoluteRaw = AbsoluteRawSyntax ( raw: child, info: info)
157
- let data = SyntaxData ( absoluteRaw, parent : Syntax ( node ) )
167
+ let data = SyntaxData ( absoluteRaw, parentBox : parentBox )
158
168
159
169
let rewritten = visit ( data)
160
170
if rewritten. data. nodeId != info. nodeId {
@@ -168,7 +178,7 @@ open class SyntaxRewriter {
168
178
// reserves enough capacity for the entire layout.
169
179
newLayout = ContiguousArray < RawSyntax ? > ( )
170
180
newLayout!. reserveCapacity ( node. raw. numberOfChildren)
171
- for j in 0 ..< i {
181
+ for j in 0 ..< childIndex {
172
182
newLayout!. append ( node. raw. child ( at: j) )
173
183
}
174
184
}
0 commit comments