@@ -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,10 @@ extension RawSyntax {
435
419
byteLength: UInt32 ,
436
420
arena: SyntaxArena
437
421
) -> RawSyntax {
422
+ assert ( arena. contains ( text: text) || kind. defaultText? . baseAddress == text. baseAddress,
423
+ " token text must be managed by the arena, or known default text for the token " )
424
+ assert ( triviaPieces. allSatisfy ( { $0. storedText. map ( { arena. contains ( text: $0) } ) ?? true } ) ,
425
+ " trivia text must be managed by the arena " )
438
426
let payload = RawSyntaxData . MaterializedToken (
439
427
tokenKind: kind, tokenText: text,
440
428
triviaPieces: triviaPieces,
@@ -443,6 +431,40 @@ extension RawSyntax {
443
431
return RawSyntax ( arena: arena, payload: . materializedToken( payload) )
444
432
}
445
433
434
+ /// Factory method to create a materialized token node.
435
+ ///
436
+ /// - Parameters:
437
+ /// - kind: Token kind.
438
+ /// - text: Token text.
439
+ /// - leadingTriviaPieceCount: Number of leading trivia pieces.
440
+ /// - trailingTriviaPieceCount: Number of trailing trivia pieces.
441
+ /// - arena: SyntaxArea to the result node data resides.
442
+ /// - initializeLeadingTriviaWith: A closure that initializes leading trivia pieces.
443
+ /// - initializingTrailingTriviaWith: A closure that initializes trailing trivia pieces.
444
+ public static func makeMaterializedToken(
445
+ kind: RawTokenKind ,
446
+ text: SyntaxText ,
447
+ leadingTriviaPieceCount: Int ,
448
+ trailingTriviaPieceCount: Int ,
449
+ arena: SyntaxArena ,
450
+ initializeLeadingTriviaWith: ( UnsafeMutableBufferPointer < RawTriviaPiece > ) -> Void ,
451
+ initializingTrailingTriviaWith : ( UnsafeMutableBufferPointer < RawTriviaPiece > ) -> Void
452
+ ) -> RawSyntax {
453
+ let totalTriviaCount = leadingTriviaPieceCount + trailingTriviaPieceCount
454
+ let triviaBuffer = arena. allocateRawTriviaPieceBuffer ( count: totalTriviaCount)
455
+ initializeLeadingTriviaWith (
456
+ UnsafeMutableBufferPointer ( rebasing: triviaBuffer [ ..< leadingTriviaPieceCount] ) )
457
+ initializingTrailingTriviaWith (
458
+ UnsafeMutableBufferPointer ( rebasing: triviaBuffer [ leadingTriviaPieceCount... ] ) )
459
+
460
+ let byteLength = text. count + triviaBuffer. reduce ( 0 , { $0 + $1. byteLength } )
461
+ return . materializedToken(
462
+ kind: kind, text: text, triviaPieces: RawTriviaPieceBuffer ( triviaBuffer) ,
463
+ numLeadingTrivia: numericCast ( leadingTriviaPieceCount) ,
464
+ byteLength: numericCast ( byteLength) ,
465
+ arena: arena)
466
+ }
467
+
446
468
/// Factory method to create a materialized token node.
447
469
///
448
470
/// - Parameters:
@@ -470,18 +492,25 @@ extension RawSyntax {
470
492
text = SyntaxText ( )
471
493
}
472
494
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)
495
+ return . makeMaterializedToken(
496
+ kind: rawKind, text: text,
497
+ leadingTriviaPieceCount: leadingTrivia. count,
498
+ trailingTriviaPieceCount: trailingTrivia. count,
499
+ arena: arena,
500
+ initializeLeadingTriviaWith: { buffer in
501
+ guard var ptr = buffer. baseAddress else { return }
502
+ for piece in leadingTrivia {
503
+ ptr. initialize ( to: . make( piece, arena: arena) )
504
+ ptr += 1
505
+ }
506
+ } ,
507
+ initializingTrailingTriviaWith: { buffer in
508
+ guard var ptr = buffer. baseAddress else { return }
509
+ for piece in trailingTrivia {
510
+ ptr. initialize ( to: . make( piece, arena: arena) )
511
+ ptr += 1
512
+ }
513
+ } )
485
514
}
486
515
487
516
static func makeMissingToken(
@@ -531,7 +560,7 @@ extension RawSyntax {
531
560
/// - kind: Syntax kind.
532
561
/// - count: Number of children.
533
562
/// - initializer: A closure that initializes elements.
534
- static func makeLayout(
563
+ public static func makeLayout(
535
564
kind: SyntaxKind ,
536
565
uninitializedCount count: Int ,
537
566
arena: SyntaxArena ,
0 commit comments