Skip to content

Commit 3db1ab8

Browse files
authored
Merge pull request #260 from ahoppen/pr/range-in-token-data
Adjust for modified C API that only returns a range for token nodes
2 parents 843c82c + e07ea51 commit 3db1ab8

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed

Sources/SwiftSyntax/RawSyntax.swift

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ fileprivate struct TokenData {
117117
let hasCustomText = TokenKind.hasText(kind: data.kind) ||
118118
hasTriviaText(leadingTriviaCount, data.leading_trivia) ||
119119
hasTriviaText(trailingTriviaCount, data.trailing_trivia)
120-
let textSize = hasCustomText ? Int(cnode.range.length) : 0
120+
let textSize = hasCustomText ? Int(data.range.length) : 0
121121

122122
let rawData: RawSyntaxData = .token(.init(kind: data.kind,
123123
leadingTriviaCount: data.leading_trivia_count,
@@ -154,11 +154,11 @@ fileprivate struct TokenData {
154154

155155
if hasCustomText {
156156
// Copy the full token text, including trivia.
157-
let startOffset = Int(cnode.range.offset)
157+
let startOffset = Int(data.range.offset)
158158
var charPtr = UnsafeMutableRawPointer(curPtr).assumingMemoryBound(to: UInt8.self)
159159
let utf8 = source.utf8
160160
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))
162162
for ch in utf8[begin..<end] {
163163
charPtr.pointee = ch
164164
charPtr = charPtr.successor()
@@ -523,22 +523,25 @@ fileprivate struct LayoutData {
523523
self.isConstructed = isConstructed
524524
}
525525

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(
528529
for kind: SyntaxKind,
529530
data: CLayoutData
530-
) -> (RawSyntaxData, Int) {
531+
) -> (data: RawSyntaxData, extraCapacity: Int, totalLength: Int) {
531532
var totalCount = 0
533+
var totalLength: Int = 0
532534
for i in 0..<Int(data.nodes_count) {
533535
if let raw = RawSyntax.getFromOpaque(data.nodes![i]) {
534536
totalCount += raw.totalNodes
537+
totalLength += raw.totalLength.utf8Length
535538
}
536539
}
537540
let totalSubNodeCount = UInt32(truncatingIfNeeded: totalCount)
538541
let rawData: RawSyntaxData = .layout(.init(kind: kind,
539542
nodeCount: data.nodes_count, totalSubNodeCount: totalSubNodeCount,
540543
isConstructed: false))
541-
return (rawData, Int(data.nodes_count))
544+
return (rawData, Int(data.nodes_count), totalLength)
542545
}
543546

544547
/// Initializes the tail-allocated elements.
@@ -876,15 +879,16 @@ final class RawSyntax: ManagedBuffer<RawSyntaxBase, RawSyntaxDataElement> {
876879
source: String
877880
) -> RawSyntax {
878881
let cnode = p.pointee
879-
let byteLength = Int(cnode.range.length)
880882
let isPresent = cnode.present
881883

882884
let data: RawSyntaxData
883885
let capacity: Int
886+
let byteLength: Int
884887
if cnode.kind == 0 {
885888
(data, capacity) = TokenData.dataAndExtraCapacity(for: cnode)
889+
byteLength = Int(cnode.token_data.range.length)
886890
} else {
887-
(data, capacity) = LayoutData.dataAndExtraCapacity(
891+
(data, capacity, byteLength) = LayoutData.dataExtraCapacityAndTotalLength(
888892
for: SyntaxKind.fromRawValue(cnode.kind), data: cnode.layout_data)
889893
}
890894
let buffer = self.create(minimumCapacity: capacity) { _ in

0 commit comments

Comments
 (0)