@@ -117,7 +117,7 @@ fileprivate struct TokenData {
117
117
let hasCustomText = TokenKind . hasText ( kind: data. kind) ||
118
118
hasTriviaText ( leadingTriviaCount, data. leading_trivia) ||
119
119
hasTriviaText ( trailingTriviaCount, data. trailing_trivia)
120
- let textSize = hasCustomText ? Int ( cnode . range. length) : 0
120
+ let textSize = hasCustomText ? Int ( data . range. length) : 0
121
121
122
122
let rawData : RawSyntaxData = . token( . init( kind: data. kind,
123
123
leadingTriviaCount: data. leading_trivia_count,
@@ -154,11 +154,11 @@ fileprivate struct TokenData {
154
154
155
155
if hasCustomText {
156
156
// Copy the full token text, including trivia.
157
- let startOffset = Int ( cnode . range. offset)
157
+ let startOffset = Int ( data . range. offset)
158
158
var charPtr = UnsafeMutableRawPointer ( curPtr) . assumingMemoryBound ( to: UInt8 . self)
159
159
let utf8 = source. utf8
160
160
let begin = utf8. index ( utf8. startIndex, offsetBy: startOffset)
161
- let end = utf8. index ( begin, offsetBy: Int ( cnode . range. length) )
161
+ let end = utf8. index ( begin, offsetBy: Int ( data . range. length) )
162
162
for ch in utf8 [ begin..< end] {
163
163
charPtr. pointee = ch
164
164
charPtr = charPtr. successor ( )
@@ -523,22 +523,25 @@ fileprivate struct LayoutData {
523
523
self . isConstructed = isConstructed
524
524
}
525
525
526
- /// Returns header `RawSyntaxData` value and number of elements to tail-allocate.
527
- static func dataAndExtraCapacity(
526
+ /// Returns header `RawSyntaxData` value, number of elements to tail-allocate
527
+ /// and the total byte length of the node.
528
+ static func dataExtraCapacityAndTotalLength(
528
529
for kind: SyntaxKind ,
529
530
data: CLayoutData
530
- ) -> ( RawSyntaxData , Int ) {
531
+ ) -> ( data : RawSyntaxData , extraCapacity : Int , totalLength : Int ) {
531
532
var totalCount = 0
533
+ var totalLength : Int = 0
532
534
for i in 0 ..< Int ( data. nodes_count) {
533
535
if let raw = RawSyntax . getFromOpaque ( data. nodes![ i] ) {
534
536
totalCount += raw. totalNodes
537
+ totalLength += raw. totalLength. utf8Length
535
538
}
536
539
}
537
540
let totalSubNodeCount = UInt32 ( truncatingIfNeeded: totalCount)
538
541
let rawData : RawSyntaxData = . layout( . init( kind: kind,
539
542
nodeCount: data. nodes_count, totalSubNodeCount: totalSubNodeCount,
540
543
isConstructed: false ) )
541
- return ( rawData, Int ( data. nodes_count) )
544
+ return ( rawData, Int ( data. nodes_count) , totalLength )
542
545
}
543
546
544
547
/// Initializes the tail-allocated elements.
@@ -876,15 +879,16 @@ final class RawSyntax: ManagedBuffer<RawSyntaxBase, RawSyntaxDataElement> {
876
879
source: String
877
880
) -> RawSyntax {
878
881
let cnode = p. pointee
879
- let byteLength = Int ( cnode. range. length)
880
882
let isPresent = cnode. present
881
883
882
884
let data : RawSyntaxData
883
885
let capacity : Int
886
+ let byteLength : Int
884
887
if cnode. kind == 0 {
885
888
( data, capacity) = TokenData . dataAndExtraCapacity ( for: cnode)
889
+ byteLength = Int ( cnode. token_data. range. length)
886
890
} else {
887
- ( data, capacity) = LayoutData . dataAndExtraCapacity (
891
+ ( data, capacity, byteLength ) = LayoutData . dataExtraCapacityAndTotalLength (
888
892
for: SyntaxKind . fromRawValue ( cnode. kind) , data: cnode. layout_data)
889
893
}
890
894
let buffer = self . create ( minimumCapacity: capacity) { _ in
0 commit comments