@@ -262,11 +262,11 @@ extension RawSyntax {
262
262
}
263
263
264
264
extension RawSyntax {
265
- func toOpaque( ) -> UnsafeRawPointer {
265
+ public func toOpaque( ) -> UnsafeRawPointer {
266
266
UnsafeRawPointer ( pointer)
267
267
}
268
268
269
- static func fromOpaque( _ pointer: UnsafeRawPointer ) -> RawSyntax {
269
+ public static func fromOpaque( _ pointer: UnsafeRawPointer ) -> RawSyntax {
270
270
Self ( pointer: pointer. assumingMemoryBound ( to: RawSyntaxData . self) )
271
271
}
272
272
}
@@ -377,24 +377,6 @@ extension RawSyntax {
377
377
378
378
// MARK: - Factories.
379
379
380
- private func makeRawTriviaPieces( leadingTrivia: Trivia , trailingTrivia: Trivia , arena: SyntaxArena ) -> ( pieces: RawTriviaPieceBuffer , byteLength: Int ) {
381
- let totalTriviaCount = leadingTrivia. count + trailingTrivia. count
382
-
383
- if totalTriviaCount != 0 {
384
- var byteLength = 0
385
- let buffer = arena. allocateRawTriviaPieceBuffer ( count: totalTriviaCount)
386
- var ptr = buffer. baseAddress!
387
- for piece in leadingTrivia + trailingTrivia {
388
- byteLength += piece. sourceLength. utf8Length
389
- ptr. initialize ( to: . make( piece, arena: arena) )
390
- ptr = ptr. advanced ( by: 1 )
391
- }
392
- return ( pieces: . init( buffer) , byteLength: byteLength)
393
- } else {
394
- return ( pieces: . init( start: nil , count: 0 ) , byteLength: 0 )
395
- }
396
- }
397
-
398
380
extension RawSyntax {
399
381
/// "Designated" factory method to create a parsed token node.
400
382
///
@@ -409,6 +391,8 @@ extension RawSyntax {
409
391
textRange: Range < SyntaxText . Index > ,
410
392
arena: SyntaxArena
411
393
) -> RawSyntax {
394
+ assert ( arena. contains ( text: wholeText) ,
395
+ " token text must be managed by the arena " )
412
396
let payload = RawSyntaxData . ParsedToken (
413
397
tokenKind: kind, wholeText: wholeText, textRange: textRange)
414
398
return RawSyntax ( arena: arena, payload: . parsedToken( payload) )
@@ -435,6 +419,9 @@ extension RawSyntax {
435
419
byteLength: UInt32 ,
436
420
arena: SyntaxArena
437
421
) -> RawSyntax {
422
+ assert ( arena. contains ( text: text) , " token text must be managed by the arena " )
423
+ assert ( triviaPieces. allSatisfy ( { $0. storedText. map ( { arena. contains ( text: $0) } ) ?? true } ) ,
424
+ " trivia text must be managed by the arena " )
438
425
let payload = RawSyntaxData . MaterializedToken (
439
426
tokenKind: kind, tokenText: text,
440
427
triviaPieces: triviaPieces,
@@ -443,6 +430,30 @@ extension RawSyntax {
443
430
return RawSyntax ( arena: arena, payload: . materializedToken( payload) )
444
431
}
445
432
433
+ public static func makeMaterializedToken(
434
+ kind: RawTokenKind ,
435
+ text: SyntaxText ,
436
+ leadingTriviaPieceCount: Int ,
437
+ trailingTriviaPieceCount: Int ,
438
+ arena: SyntaxArena ,
439
+ initializeLeadingTriviaWith: ( UnsafeMutableBufferPointer < RawTriviaPiece > ) -> Void ,
440
+ initializingTrailingTriviaWith : ( UnsafeMutableBufferPointer < RawTriviaPiece > ) -> Void
441
+ ) -> RawSyntax {
442
+ let totalTriviaCount = leadingTriviaPieceCount + trailingTriviaPieceCount
443
+ let triviaBuffer = arena. allocateRawTriviaPieceBuffer ( count: totalTriviaCount)
444
+ initializeLeadingTriviaWith (
445
+ UnsafeMutableBufferPointer ( rebasing: triviaBuffer [ ..< leadingTriviaPieceCount] ) )
446
+ initializingTrailingTriviaWith (
447
+ UnsafeMutableBufferPointer ( rebasing: triviaBuffer [ leadingTriviaPieceCount... ] ) )
448
+
449
+ let byteLength = text. count + triviaBuffer. reduce ( 0 , { $0 + $1. byteLength } )
450
+ return . materializedToken(
451
+ kind: kind, text: text, triviaPieces: RawTriviaPieceBuffer ( triviaBuffer) ,
452
+ numLeadingTrivia: numericCast ( leadingTriviaPieceCount) ,
453
+ byteLength: numericCast ( byteLength) ,
454
+ arena: arena)
455
+ }
456
+
446
457
/// Factory method to create a materialized token node.
447
458
///
448
459
/// - Parameters:
@@ -470,18 +481,25 @@ extension RawSyntax {
470
481
text = SyntaxText ( )
471
482
}
472
483
473
- var byteLength = text. count
474
-
475
- let triviaPieces = makeRawTriviaPieces (
476
- leadingTrivia: leadingTrivia, trailingTrivia: trailingTrivia, arena: arena)
477
-
478
- byteLength += triviaPieces. byteLength
479
-
480
- return . materializedToken(
481
- kind: rawKind, text: text, triviaPieces: triviaPieces. pieces,
482
- numLeadingTrivia: numericCast ( leadingTrivia. count) ,
483
- byteLength: numericCast ( byteLength) ,
484
- arena: arena)
484
+ return . makeMaterializedToken(
485
+ kind: rawKind, text: text,
486
+ leadingTriviaPieceCount: leadingTrivia. count,
487
+ trailingTriviaPieceCount: trailingTrivia. count,
488
+ arena: arena,
489
+ initializeLeadingTriviaWith: { buffer in
490
+ guard var ptr = buffer. baseAddress else { return }
491
+ for piece in leadingTrivia {
492
+ ptr. initialize ( to: . make( piece, arena: arena) )
493
+ ptr += 1
494
+ }
495
+ } ,
496
+ initializingTrailingTriviaWith: { buffer in
497
+ guard var ptr = buffer. baseAddress else { return }
498
+ for piece in trailingTrivia {
499
+ ptr. initialize ( to: . make( piece, arena: arena) )
500
+ ptr += 1
501
+ }
502
+ } )
485
503
}
486
504
487
505
static func makeMissingToken(
@@ -531,7 +549,7 @@ extension RawSyntax {
531
549
/// - kind: Syntax kind.
532
550
/// - count: Number of children.
533
551
/// - initializer: A closure that initializes elements.
534
- static func makeLayout(
552
+ public static func makeLayout(
535
553
kind: SyntaxKind ,
536
554
uninitializedCount count: Int ,
537
555
arena: SyntaxArena ,
@@ -564,7 +582,7 @@ extension RawSyntax {
564
582
)
565
583
}
566
584
567
- static func makeEmptyLayout(
585
+ public static func makeEmptyLayout(
568
586
kind: SyntaxKind ,
569
587
arena: SyntaxArena
570
588
) -> RawSyntax {
@@ -582,7 +600,7 @@ extension RawSyntax {
582
600
)
583
601
}
584
602
585
- static func makeLayout< C: Collection > (
603
+ public static func makeLayout< C: Collection > (
586
604
kind: SyntaxKind ,
587
605
from collection: C ,
588
606
arena: SyntaxArena
0 commit comments