Skip to content

Commit e1528fd

Browse files
committed
Keep 'SyntaxArena's of rewritten children alive.
1 parent 3b3f372 commit e1528fd

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

Sources/SwiftSyntax/gyb_generated/SyntaxRewriter.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5849,6 +5849,10 @@ open class SyntaxRewriter {
58495849
// nodes are being collected.
58505850
var newLayout: ContiguousArray<RawSyntax?>?
58515851

5852+
// Rewritten children just to keep their 'SyntaxArena' alive until they are
5853+
// wrapped with 'Syntax'
5854+
var rewrittens: ContiguousArray<Syntax> = []
5855+
58525856
let syntaxNode = node._syntaxNode
58535857

58545858
// Incrementing i manually is faster than using .enumerated()
@@ -5887,6 +5891,7 @@ open class SyntaxRewriter {
58875891

58885892
// Now that we know we have a new layout in which we collect rewritten
58895893
// nodes, add it.
5894+
rewrittens.append(rewritten)
58905895
newLayout!.append(rewritten.raw)
58915896
} else {
58925897
// The node was not changed by the rewriter. Only store it if a previous
@@ -5902,10 +5907,12 @@ open class SyntaxRewriter {
59025907

59035908
// Sanity check, ensure the new children are the same length.
59045909
assert(newLayout.count == node.raw.layoutView!.children.count)
5905-
5910+
59065911
let newRaw = node.raw.layoutView!.replacingLayout(with: Array(newLayout), arena: .default)
5907-
let newNode = SyntaxType(Syntax(SyntaxData.forRoot(newRaw)))!
5908-
return newNode
5912+
// 'withExtendedLifetime' to keep 'SyntaxArena's of them alive until here.
5913+
return withExtendedLifetime(rewrittens) {
5914+
SyntaxType(Syntax(SyntaxData.forRoot(newRaw)))!
5915+
}
59095916
} else {
59105917
// No child node was rewritten. So no need to change this node as well.
59115918
return node

0 commit comments

Comments
 (0)