@@ -95,7 +95,7 @@ public struct RawSyntaxTokenView: Sendable {
9595 public var leadingRawTriviaPieces : [ RawTriviaPiece ] {
9696 switch raw. rawData. payload {
9797 case . parsedToken( let dat) :
98- let arena = raw. arena. parsingArena!
98+ let arena = raw. arena as! ParsingSyntaxArena
9999 return arena. parseTrivia ( source: dat. leadingTriviaText, position: . leading)
100100 case . materializedToken( let dat) :
101101 return Array ( dat. leadingTrivia)
@@ -108,7 +108,7 @@ public struct RawSyntaxTokenView: Sendable {
108108 public var trailingRawTriviaPieces : [ RawTriviaPiece ] {
109109 switch raw. rawData. payload {
110110 case . parsedToken( let dat) :
111- let arena = raw. arena. parsingArena!
111+ let arena = raw. arena as! ParsingSyntaxArena
112112 return arena. parseTrivia ( source: dat. trailingTriviaText, position: . trailing)
113113 case . materializedToken( let dat) :
114114 return Array ( dat. trailingTrivia)
@@ -204,8 +204,21 @@ public struct RawSyntaxTokenView: Sendable {
204204 arena. addChild ( self . raw. arenaReference)
205205 switch raw. rawData. payload {
206206 case . parsedToken( var payload) :
207- payload. presence = newValue
208- return RawSyntax ( arena: arena, payload: . parsedToken( payload) )
207+ if arena === self . raw. arena {
208+ payload. presence = newValue
209+ return RawSyntax ( arena: arena, payload: . parsedToken( payload) )
210+ }
211+ // If the modified token is allocated in a different arena, it might have
212+ // a different or no `parseTrivia` function. We thus cannot use a
213+ // `parsedToken` anymore.
214+ return . makeMaterializedToken(
215+ kind: formKind ( ) ,
216+ leadingTrivia: formLeadingTrivia ( ) ,
217+ trailingTrivia: formTrailingTrivia ( ) ,
218+ presence: newValue,
219+ tokenDiagnostic: tokenDiagnostic,
220+ arena: arena
221+ )
209222 case . materializedToken( var payload) :
210223 payload. presence = newValue
211224 return RawSyntax ( arena: arena, payload: . materializedToken( payload) )
@@ -274,8 +287,21 @@ public struct RawSyntaxTokenView: Sendable {
274287 arena. addChild ( self . raw. arenaReference)
275288 switch raw. rawData. payload {
276289 case . parsedToken( var dat) :
277- dat. tokenDiagnostic = tokenDiagnostic
278- return RawSyntax ( arena: arena, payload: . parsedToken( dat) )
290+ if arena === self . raw. arena {
291+ dat. tokenDiagnostic = tokenDiagnostic
292+ return RawSyntax ( arena: arena, payload: . parsedToken( dat) )
293+ }
294+ // If the modified token is allocated in a different arena, it might have
295+ // a different or no `parseTrivia` function. We thus cannot use a
296+ // `parsedToken` anymore.
297+ return . makeMaterializedToken(
298+ kind: formKind ( ) ,
299+ leadingTrivia: formLeadingTrivia ( ) ,
300+ trailingTrivia: formTrailingTrivia ( ) ,
301+ presence: presence,
302+ tokenDiagnostic: tokenDiagnostic,
303+ arena: arena
304+ )
279305 case . materializedToken( var dat) :
280306 dat. tokenDiagnostic = tokenDiagnostic
281307 return RawSyntax ( arena: arena, payload: . materializedToken( dat) )
0 commit comments