@@ -282,6 +282,55 @@ fileprivate struct TokenData {
282
282
}
283
283
}
284
284
285
+ fileprivate func withUnsafeTokenText< Result> (
286
+ relativeOffset: Int ,
287
+ length: UInt32 ,
288
+ extraPtr: DataElementPtr ,
289
+ _ body: ( UnsafeTokenText ) -> Result
290
+ ) -> Result {
291
+ if isParsed {
292
+ let data = parsedData ( length: length, extraPtr: extraPtr)
293
+ return body ( data. getTokenText ( relativeOffset: relativeOffset) )
294
+ } else {
295
+ let tok : ConstructedTokenData = castElementAs ( extraPtr) . pointee
296
+ return tok. kind. withUnsafeTokenText ( body)
297
+ }
298
+ }
299
+
300
+ fileprivate func withUnsafeLeadingTriviaPiece< Result> (
301
+ at index: Int ,
302
+ relativeOffset: Int ,
303
+ length: UInt32 ,
304
+ extraPtr: DataElementPtr ,
305
+ _ body: ( UnsafeTriviaPiece ? ) -> Result
306
+ ) -> Result {
307
+ if isParsed {
308
+ let data = parsedData ( length: length, extraPtr: extraPtr)
309
+ return body ( data. getLeadingTriviaPiece ( at: index, relativeOffset: relativeOffset) )
310
+ } else {
311
+ let tok : ConstructedTokenData = castElementAs ( extraPtr) . pointee
312
+ guard index < tok. leadingTrivia. count else { return body ( nil ) }
313
+ return tok. leadingTrivia [ index] . withUnsafeTriviaPiece ( body)
314
+ }
315
+ }
316
+
317
+ fileprivate func withUnsafeTrailingTriviaPiece< Result> (
318
+ at index: Int ,
319
+ relativeOffset: Int ,
320
+ length: UInt32 ,
321
+ extraPtr: DataElementPtr ,
322
+ _ body: ( UnsafeTriviaPiece ? ) -> Result
323
+ ) -> Result {
324
+ if isParsed {
325
+ let data = parsedData ( length: length, extraPtr: extraPtr)
326
+ return body ( data. getTrailingTriviaPiece ( at: index, relativeOffset: relativeOffset) )
327
+ } else {
328
+ let tok : ConstructedTokenData = castElementAs ( extraPtr) . pointee
329
+ guard index < tok. trailingTrivia. count else { return body ( nil ) }
330
+ return tok. trailingTrivia [ index] . withUnsafeTriviaPiece ( body)
331
+ }
332
+ }
333
+
285
334
/// Prints the RawSyntax token.
286
335
fileprivate func write< Target> (
287
336
to target: inout Target , length: UInt32 , extraPtr: DataElementPtr
@@ -368,6 +417,42 @@ fileprivate struct UnsafeParsedTokenData {
368
417
return . init( pieces: newPieces)
369
418
}
370
419
420
+ func getTokenText( relativeOffset: Int ) -> UnsafeTokenText {
421
+ let leadingTriviaLength = relativeOffset
422
+ let trailingTriviaLength = self . getTrailingTriviaLength ( )
423
+ let tokenLength = Int ( length) - ( leadingTriviaLength + trailingTriviaLength)
424
+ let customText = fullTextBuffer. isEmpty ? emptyStringBuffer :
425
+ getTextSlice ( start: relativeOffset, length: tokenLength)
426
+ return . init( kind: . fromRawValue( tokenKind) , length: tokenLength, customText: customText)
427
+ }
428
+
429
+ func getLeadingTriviaPiece(
430
+ at index: Int , relativeOffset: Int
431
+ ) -> UnsafeTriviaPiece ? {
432
+ return getTriviaPiece ( at: index, relativeOffset: relativeOffset,
433
+ trivia: leadingTriviaBuffer)
434
+ }
435
+
436
+ func getTrailingTriviaPiece(
437
+ at index: Int , relativeOffset: Int
438
+ ) -> UnsafeTriviaPiece ? {
439
+ return getTriviaPiece ( at: index, relativeOffset: relativeOffset,
440
+ trivia: trailingTriviaBuffer)
441
+ }
442
+
443
+ private func getTriviaPiece(
444
+ at index: Int ,
445
+ relativeOffset: Int ,
446
+ trivia: UnsafeBufferPointer < CTriviaPiece >
447
+ ) -> UnsafeTriviaPiece ? {
448
+ guard index < trivia. count else { return nil }
449
+ let cpiece = trivia [ index]
450
+ let length = Int ( cpiece. length)
451
+ let customText = fullTextBuffer. isEmpty ? emptyStringBuffer :
452
+ getTextSlice ( start: relativeOffset, length: length)
453
+ return . init( kind: . fromRawValue( cpiece. kind) , length: length, customText: customText)
454
+ }
455
+
371
456
func write< Target> (
372
457
to target: inout Target
373
458
) where Target: TextOutputStream {
@@ -719,6 +804,47 @@ struct RawSyntaxBase {
719
804
}
720
805
}
721
806
807
+ fileprivate func withUnsafeTokenText< Result> (
808
+ relativeOffset: Int ,
809
+ extraPtr: DataElementPtr ,
810
+ _ body: ( UnsafeTokenText ? ) -> Result
811
+ ) -> Result {
812
+ switch data {
813
+ case . token( let data) :
814
+ return data. withUnsafeTokenText ( relativeOffset: relativeOffset,
815
+ length: byteLength, extraPtr: extraPtr, body)
816
+ case . layout( _) : return body ( nil )
817
+ }
818
+ }
819
+
820
+ fileprivate func withUnsafeLeadingTriviaPiece< Result> (
821
+ at index: Int ,
822
+ relativeOffset: Int ,
823
+ extraPtr: DataElementPtr ,
824
+ _ body: ( UnsafeTriviaPiece ? ) -> Result
825
+ ) -> Result {
826
+ switch data {
827
+ case . token( let data) :
828
+ return data. withUnsafeLeadingTriviaPiece ( at: index, relativeOffset: relativeOffset,
829
+ length: byteLength, extraPtr: extraPtr, body)
830
+ case . layout( _) : return body ( nil )
831
+ }
832
+ }
833
+
834
+ fileprivate func withUnsafeTrailingTriviaPiece< Result> (
835
+ at index: Int ,
836
+ relativeOffset: Int ,
837
+ extraPtr: DataElementPtr ,
838
+ _ body: ( UnsafeTriviaPiece ? ) -> Result
839
+ ) -> Result {
840
+ switch data {
841
+ case . token( let data) :
842
+ return data. withUnsafeTrailingTriviaPiece ( at: index, relativeOffset: relativeOffset,
843
+ length: byteLength, extraPtr: extraPtr, body)
844
+ case . layout( _) : return body ( nil )
845
+ }
846
+ }
847
+
722
848
/// Prints the RawSyntax token. If self is a layout node it does nothing.
723
849
fileprivate func writeToken< Target> (
724
850
to target: inout Target , extraPtr: DataElementPtr
@@ -909,6 +1035,64 @@ final class RawSyntax: ManagedBuffer<RawSyntaxBase, RawSyntaxDataElement> {
909
1035
}
910
1036
}
911
1037
1038
+ /// Passes token info to the provided closure as `UnsafeTokenText`.
1039
+ /// - Parameters:
1040
+ /// - relativeOffset: For efficiency, the caller keeps track of the relative
1041
+ /// byte offset (from start of leading trivia) of the token text, to avoid
1042
+ /// calculating it within this function.
1043
+ /// - body: The closure that accepts the `UnsafeTokenText` value. This value
1044
+ /// must not escape the closure.
1045
+ /// - Returns: Return value of `body`.
1046
+ func withUnsafeTokenText< Result> (
1047
+ relativeOffset: Int ,
1048
+ _ body: ( UnsafeTokenText ? ) -> Result
1049
+ ) -> Result {
1050
+ return withUnsafeMutablePointers {
1051
+ $0. pointee. withUnsafeTokenText ( relativeOffset: relativeOffset,
1052
+ extraPtr: $1, body)
1053
+ }
1054
+ }
1055
+
1056
+ /// Passes trivia piece info to the provided closure as `UnsafeTriviaPiece`.
1057
+ /// - Parameters:
1058
+ /// - at: The index for the trivia piace.
1059
+ /// - relativeOffset: For efficiency, the caller keeps track of the relative
1060
+ /// byte offset (from start of leading trivia) of the trivia piece text,
1061
+ /// to avoid calculating it within this function.
1062
+ /// - body: The closure that accepts the `UnsafeTokenText` value. This value
1063
+ /// must not escape the closure.
1064
+ /// - Returns: Return value of `body`.
1065
+ func withUnsafeLeadingTriviaPiece< Result> (
1066
+ at index: Int ,
1067
+ relativeOffset: Int ,
1068
+ _ body: ( UnsafeTriviaPiece ? ) -> Result
1069
+ ) -> Result {
1070
+ return withUnsafeMutablePointers {
1071
+ $0. pointee. withUnsafeLeadingTriviaPiece ( at: index,
1072
+ relativeOffset: relativeOffset, extraPtr: $1, body)
1073
+ }
1074
+ }
1075
+
1076
+ /// Passes trivia piece info to the provided closure as `UnsafeTriviaPiece`.
1077
+ /// - Parameters:
1078
+ /// - at: The index for the trivia piace.
1079
+ /// - relativeOffset: For efficiency, the caller keeps track of the relative
1080
+ /// byte offset (from start of leading trivia) of the trivia piece text,
1081
+ /// to avoid calculating it within this function.
1082
+ /// - body: The closure that accepts the `UnsafeTokenText` value. This value
1083
+ /// must not escape the closure.
1084
+ /// - Returns: Return value of `body`.
1085
+ func withUnsafeTrailingTriviaPiece< Result> (
1086
+ at index: Int ,
1087
+ relativeOffset: Int ,
1088
+ _ body: ( UnsafeTriviaPiece ? ) -> Result
1089
+ ) -> Result {
1090
+ return withUnsafeMutablePointers {
1091
+ $0. pointee. withUnsafeTrailingTriviaPiece ( at: index,
1092
+ relativeOffset: relativeOffset, extraPtr: $1, body)
1093
+ }
1094
+ }
1095
+
912
1096
func formLayoutArray( ) -> [ RawSyntax ? ] {
913
1097
return withUnsafeMutablePointers {
914
1098
$0. pointee. formLayoutArray ( extraPtr: $1)
@@ -1114,3 +1298,51 @@ extension RawSyntax {
1114
1298
trailingTrivia: trailingTrivia, length: length, presence: presence)
1115
1299
}
1116
1300
}
1301
+
1302
+ /// Token info with its custom text as `UnsafeBufferPointer`. This is only safe
1303
+ /// to use from within the `withUnsafeTokenText` methods.
1304
+ internal struct UnsafeTokenText {
1305
+ let kind : RawTokenKind
1306
+ let length : Int
1307
+ let customText : UnsafeBufferPointer < UInt8 >
1308
+
1309
+ init ( kind: RawTokenKind , length: Int ) {
1310
+ self . kind = kind
1311
+ self . length = length
1312
+ self . customText = . init( start: nil , count: 0 )
1313
+ }
1314
+
1315
+ init ( kind: RawTokenKind , length: Int , customText: UnsafeBufferPointer < UInt8 > ) {
1316
+ self . kind = kind
1317
+ self . length = length
1318
+ self . customText = customText
1319
+ }
1320
+ }
1321
+
1322
+ /// Trivia piece info with its custom text as `UnsafeBufferPointer`. This is
1323
+ /// only safe to use from within the `withUnsafeLeadingTriviaPiece` and
1324
+ /// `withUnsafeTrailingTriviaPiece` methods.
1325
+ internal struct UnsafeTriviaPiece {
1326
+ let kind : TriviaPieceKind
1327
+ let length : Int
1328
+ let customText : UnsafeBufferPointer < UInt8 >
1329
+
1330
+ init ( kind: TriviaPieceKind , length: Int ) {
1331
+ self . kind = kind
1332
+ self . length = length
1333
+ self . customText = . init( start: nil , count: 0 )
1334
+ }
1335
+
1336
+ init ( kind: TriviaPieceKind , length: Int , customText: UnsafeBufferPointer < UInt8 > ) {
1337
+ self . kind = kind
1338
+ self . length = length
1339
+ self . customText = customText
1340
+ }
1341
+
1342
+ static func fromRawValue(
1343
+ _ piece: CTriviaPiece , textBuffer: UnsafeBufferPointer < UInt8 >
1344
+ ) -> UnsafeTriviaPiece {
1345
+ return UnsafeTriviaPiece ( kind: . fromRawValue( piece. kind) ,
1346
+ length: Int ( piece. length) , customText: textBuffer)
1347
+ }
1348
+ }
0 commit comments