Skip to content

Commit 101bbc6

Browse files
authored
Merge pull request #614 from rintaro/syntaxparser-move
2 parents d65c5bc + 6bcf9fd commit 101bbc6

20 files changed

+988
-835
lines changed

Package.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ let package = Package(
9494
name: "SwiftSyntaxParser",
9595
dependencies: ["SwiftSyntax"],
9696
exclude: [
97-
"NodeDeclarationHash.swift.gyb"
97+
"NodeDeclarationHash.swift.gyb",
98+
"Serialization.swift.gyb",
9899
],
99100
linkerSettings: swiftSyntaxParserLinkerSettings
100101
),

Sources/SwiftSyntax/CNodes.swift

Lines changed: 0 additions & 73 deletions
This file was deleted.

Sources/SwiftSyntax/IncrementalParseTransition.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,12 +249,13 @@ public struct IncrementalParseLookup {
249249
/// - Returns: A `SyntaxNode` node from the previous parse invocation,
250250
/// representing the contents of this region, if it is still valid
251251
/// to re-use. `nil` otherwise.
252-
public mutating func lookUp(_ newOffset: Int, kind: CSyntaxKind) -> SyntaxNode? {
252+
@_spi(RawSyntax)
253+
public mutating func lookUp(_ newOffset: Int, kind: SyntaxKind) -> SyntaxNode? {
253254
guard let prevOffset = translateToPreEditOffset(newOffset) else {
254255
return nil
255256
}
256257
let prevPosition = AbsolutePosition(utf8Offset: prevOffset)
257-
let node = cursorLookup(prevPosition: prevPosition, kind: .fromRawValue(kind))
258+
let node = cursorLookup(prevPosition: prevPosition, kind: kind)
258259
if let delegate = reusedDelegate, let node = node {
259260
delegate.parserReusedNode(
260261
range: ByteSourceRange(offset: newOffset, length: node.byteSize),

Sources/SwiftSyntax/Raw/RawSyntax+CSwiftSyntax.swift

Lines changed: 0 additions & 114 deletions
This file was deleted.

Sources/SwiftSyntax/Raw/RawSyntax.swift

Lines changed: 62 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -262,11 +262,11 @@ extension RawSyntax {
262262
}
263263

264264
extension RawSyntax {
265-
func toOpaque() -> UnsafeRawPointer {
265+
public func toOpaque() -> UnsafeRawPointer {
266266
UnsafeRawPointer(pointer)
267267
}
268268

269-
static func fromOpaque(_ pointer: UnsafeRawPointer) -> RawSyntax {
269+
public static func fromOpaque(_ pointer: UnsafeRawPointer) -> RawSyntax {
270270
Self(pointer: pointer.assumingMemoryBound(to: RawSyntaxData.self))
271271
}
272272
}
@@ -377,24 +377,6 @@ extension RawSyntax {
377377

378378
// MARK: - Factories.
379379

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-
398380
extension RawSyntax {
399381
/// "Designated" factory method to create a parsed token node.
400382
///
@@ -409,6 +391,8 @@ extension RawSyntax {
409391
textRange: Range<SyntaxText.Index>,
410392
arena: SyntaxArena
411393
) -> RawSyntax {
394+
assert(arena.contains(text: wholeText),
395+
"token text must be managed by the arena")
412396
let payload = RawSyntaxData.ParsedToken(
413397
tokenKind: kind, wholeText: wholeText, textRange: textRange)
414398
return RawSyntax(arena: arena, payload: .parsedToken(payload))
@@ -435,6 +419,10 @@ extension RawSyntax {
435419
byteLength: UInt32,
436420
arena: SyntaxArena
437421
) -> 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")
438426
let payload = RawSyntaxData.MaterializedToken(
439427
tokenKind: kind, tokenText: text,
440428
triviaPieces: triviaPieces,
@@ -443,6 +431,40 @@ extension RawSyntax {
443431
return RawSyntax(arena: arena, payload: .materializedToken(payload))
444432
}
445433

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+
/// - initializingLeadingTriviaWith: 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+
initializingLeadingTriviaWith: (UnsafeMutableBufferPointer<RawTriviaPiece>) -> Void,
451+
initializingTrailingTriviaWith : (UnsafeMutableBufferPointer<RawTriviaPiece>) -> Void
452+
) -> RawSyntax {
453+
let totalTriviaCount = leadingTriviaPieceCount + trailingTriviaPieceCount
454+
let triviaBuffer = arena.allocateRawTriviaPieceBuffer(count: totalTriviaCount)
455+
initializingLeadingTriviaWith(
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+
446468
/// Factory method to create a materialized token node.
447469
///
448470
/// - Parameters:
@@ -470,18 +492,25 @@ extension RawSyntax {
470492
text = SyntaxText()
471493
}
472494

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+
initializingLeadingTriviaWith: { 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+
})
485514
}
486515

487516
static func makeMissingToken(
@@ -531,7 +560,7 @@ extension RawSyntax {
531560
/// - kind: Syntax kind.
532561
/// - count: Number of children.
533562
/// - initializer: A closure that initializes elements.
534-
static func makeLayout(
563+
public static func makeLayout(
535564
kind: SyntaxKind,
536565
uninitializedCount count: Int,
537566
arena: SyntaxArena,

0 commit comments

Comments
 (0)