Skip to content

Commit d272eb7

Browse files
committed
Add basic RawSyntaxData.ParsedToken test
1 parent cfbec20 commit d272eb7

File tree

4 files changed

+41
-11
lines changed

4 files changed

+41
-11
lines changed

Sources/SwiftSyntax/RawSyntax.swift

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ internal struct RawSyntaxData {
2424
/// Token with lazy trivia parsing.
2525
///
2626
/// The RawSyntax's `arena` must have a valid trivia parsing function to
27-
/// lazily materialize the leading/trailing trivia pieces.
27+
/// lazily materialize the leading/trailing trivia xpieces.
2828
struct ParsedToken {
2929
var tokenKind: RawTokenKind
3030

@@ -307,13 +307,13 @@ extension RawSyntax {
307307
}
308308

309309
/// Returns the leading `Trivia`, assuming this node is a token.
310-
func formTokenLeadingTrivia() -> Trivia? {
310+
func formTokenLeadingTrivia() -> Trivia {
311311
return Trivia(pieces: tokenLeadingRawTriviaPieces.map({ TriviaPiece(raw: $0) }))
312312
}
313313

314314
/// Returns the trailing `Trivia`, assuming this node is a token.
315315
/// - Returns: nil if called on a layout node.
316-
func formTokenTrailingTrivia() -> Trivia? {
316+
func formTokenTrailingTrivia() -> Trivia {
317317
return Trivia(pieces: tokenTrailingRawTriviaPieces.map({ TriviaPiece(raw: $0) }))
318318
}
319319

@@ -334,10 +334,11 @@ extension RawSyntax {
334334
func withTokenKind(_ newValue: TokenKind) -> RawSyntax {
335335
switch rawData.payload {
336336
case .parsedToken(_):
337+
// The wholeText can't be continuous anymore. Make a materialized token.
337338
return .makeMaterializedToken(
338339
kind: newValue,
339-
leadingTrivia: formLeadingTrivia()!,
340-
trailingTrivia: formTokenTrailingTrivia()!,
340+
leadingTrivia: formTokenLeadingTrivia(),
341+
trailingTrivia: formTokenTrailingTrivia(),
341342
arena: arena)
342343
case .materializedToken(var payload):
343344
let decomposed = newValue.decomposeToRaw()
@@ -362,7 +363,7 @@ extension RawSyntax {
362363
return .makeMaterializedToken(
363364
kind: formTokenKind()!,
364365
leadingTrivia: leadingTrivia,
365-
trailingTrivia: formTokenTrailingTrivia()!,
366+
trailingTrivia: formTokenTrailingTrivia(),
366367
arena: arena)
367368
}
368369

@@ -382,7 +383,7 @@ extension RawSyntax {
382383
if isToken {
383384
return .makeMaterializedToken(
384385
kind: formTokenKind()!,
385-
leadingTrivia: formTokenLeadingTrivia()!,
386+
leadingTrivia: formTokenLeadingTrivia(),
386387
trailingTrivia: trailingTrivia,
387388
arena: arena)
388389
}

Sources/SwiftSyntax/Syntax.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,14 @@ public protocol SyntaxProtocol: CustomStringConvertible,
118118
var syntaxNodeType: SyntaxProtocol.Type { get }
119119
}
120120

121-
internal extension SyntaxProtocol {
121+
extension SyntaxProtocol {
122122
var data: SyntaxData {
123123
return _syntaxNode.data
124124
}
125125

126126
/// Access the raw syntax assuming the node is a Syntax.
127-
var raw: RawSyntax {
127+
@_spi(RawSyntax)
128+
public var raw: RawSyntax {
128129
return _syntaxNode.data.raw
129130
}
130131
}

Sources/SwiftSyntax/SyntaxOtherNodes.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public struct TokenSyntax: SyntaxProtocol, SyntaxHashable {
144144
/// The leading trivia (spaces, newlines, etc.) associated with this token.
145145
public var leadingTrivia: Trivia {
146146
get {
147-
return raw.formTokenLeadingTrivia()!
147+
return raw.formTokenLeadingTrivia()
148148
}
149149
set {
150150
self = withLeadingTrivia(newValue)
@@ -154,7 +154,7 @@ public struct TokenSyntax: SyntaxProtocol, SyntaxHashable {
154154
/// The trailing trivia (spaces, newlines, etc.) associated with this token.
155155
public var trailingTrivia: Trivia {
156156
get {
157-
return raw.formTokenTrailingTrivia()!
157+
return raw.formTokenTrailingTrivia()
158158
}
159159
set {
160160
self = withTrailingTrivia(newValue)

Tests/SwiftSyntaxTest/RawSyntaxTests.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,5 +80,33 @@ final class RawSyntaxTests: XCTestCase {
8080
}
8181
}
8282

83+
func testParsedToken() throws {
84+
// Dummy trivia parsing function.
85+
func dummyParseToken(source: SyntaxText, isTrailing: Bool) -> [RawTriviaPiece] {
86+
// Emit a single `unexpectedText` trivia of the whole trivia text.
87+
return [.unexpectedText(source)]
88+
}
8389

90+
withExtendedLifetime(SyntaxArena(parseTriviaFunction: dummyParseToken)) { arena in
91+
let ident = RawTokenSyntax(
92+
kind: .identifier, wholeText: arena.intern("\nfoo "),
93+
textRange: 1..<4, arena: arena)
94+
XCTAssertEqual(ident.tokenKind, .identifier)
95+
XCTAssertEqual(ident.tokenText, "foo")
96+
XCTAssertEqual(ident.presence, .present)
97+
XCTAssertEqual(ident.leadingTriviaPieces, [.unexpectedText("\n")])
98+
XCTAssertEqual(ident.trailingTriviaPieces, [.unexpectedText(" ")])
99+
XCTAssertEqual(ident.description, "\nfoo ")
100+
101+
let identSyntax = Syntax(raw: ident.raw).as(TokenSyntax.self)!
102+
let barIdentSyntax = identSyntax.withKind(.contextualKeyword("open"))
103+
let barIdent = barIdentSyntax.raw.as(RawTokenSyntax.self)!
104+
105+
XCTAssertEqual(barIdent.tokenKind, .contextualKeyword)
106+
XCTAssertEqual(barIdent.tokenText, "open")
107+
XCTAssertEqual(barIdent.leadingTriviaPieces, [.unexpectedText("\n")])
108+
XCTAssertEqual(barIdent.trailingTriviaPieces, [.unexpectedText(" ")])
109+
XCTAssertEqual(barIdent.description, "\nopen ")
110+
}
111+
}
84112
}

0 commit comments

Comments
 (0)