@@ -182,34 +182,57 @@ struct AbsoluteRawSyntax {
182
182
}
183
183
}
184
184
185
+ class Wrapper < T> {
186
+ var value : T
187
+
188
+ init ( _ value: T ) {
189
+ self . value = value
190
+ }
191
+
192
+ var pointer : UnsafeMutablePointer < T > {
193
+ return withUnsafeMutablePointer ( to: & value) { $0 }
194
+ }
195
+ }
196
+
185
197
/// SyntaxData is the underlying storage for each Syntax node.
186
198
///
187
199
/// SyntaxData is an implementation detail, and should not be exposed to clients
188
200
/// of SwiftSyntax.
189
201
struct SyntaxData {
190
202
fileprivate enum Info {
191
- case root( Root )
203
+ case root( Wrapper < Root > )
192
204
indirect case nonRoot( NonRoot )
193
205
194
206
// For root node.
195
207
struct Root {
196
208
var arena : SyntaxArena
209
+
210
+ init ( arena: SyntaxArena ) {
211
+ self . arena = arena
212
+ }
197
213
}
198
214
199
215
// For non-root nodes.
200
216
struct NonRoot {
201
217
var parent : SyntaxData
202
218
var absoluteInfo : AbsoluteSyntaxInfo
219
+ var rootInfo : UnsafeMutablePointer < Root >
220
+
221
+ init ( parent: SyntaxData , absoluteInfo: AbsoluteSyntaxInfo , rootInfo: UnsafeMutablePointer < Root > ) {
222
+ self . parent = parent
223
+ self . absoluteInfo = absoluteInfo
224
+ self . rootInfo = rootInfo
225
+ }
203
226
}
204
227
}
205
228
206
229
private let info : Info
207
230
let raw : RawSyntax
208
231
209
- private var rootInfo : Info . Root {
232
+ private var rootInfo : UnsafeMutablePointer < Info . Root > {
210
233
switch info {
211
- case . root( let info) : return info
212
- case . nonRoot( let info) : return info. parent . rootInfo
234
+ case . root( let info) : return info. pointer
235
+ case . nonRoot( let info) : return info. rootInfo
213
236
}
214
237
}
215
238
@@ -274,7 +297,7 @@ struct SyntaxData {
274
297
}
275
298
276
299
init ( _ raw: RawSyntax , parent: SyntaxData , absoluteInfo: AbsoluteSyntaxInfo ) {
277
- self . init ( raw, info: . nonRoot( . init( parent: parent, absoluteInfo: absoluteInfo) ) )
300
+ self . init ( raw, info: . nonRoot( . init( parent: parent, absoluteInfo: absoluteInfo, rootInfo : parent . rootInfo ) ) )
278
301
}
279
302
280
303
/// Creates a `SyntaxData` with the provided raw syntax and parent.
@@ -294,7 +317,7 @@ struct SyntaxData {
294
317
/// has a chance to retain it.
295
318
static func forRoot( _ raw: RawSyntax , rawNodeArena: SyntaxArena ) -> SyntaxData {
296
319
precondition ( rawNodeArena === raw. arena)
297
- return SyntaxData ( raw, info: . root( . init ( arena: rawNodeArena) ) )
320
+ return SyntaxData ( raw, info: . root( Wrapper ( Info . Root ( arena: rawNodeArena) ) ) )
298
321
}
299
322
300
323
/// Returns the child data at the provided index in this data's layout.
0 commit comments