Skip to content

Commit 326efb3

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

File tree

4 files changed

+42
-11
lines changed

4 files changed

+42
-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: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,5 +80,34 @@ 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+
}
89+
90+
withExtendedLifetime(SyntaxArena(parseTriviaFunction: dummyParseToken)) { arena in
91+
let ident = RawTokenSyntax(
92+
kind: .identifier, wholeText: arena.intern("\nfoo "), textRange: 1..<4,
93+
arena: arena)
8394

95+
XCTAssertEqual(ident.tokenKind, .identifier)
96+
XCTAssertEqual(ident.tokenText, "foo")
97+
XCTAssertEqual(ident.presence, .present)
98+
XCTAssertEqual(ident.leadingTriviaPieces, [.unexpectedText("\n")])
99+
XCTAssertEqual(ident.trailingTriviaPieces, [.unexpectedText(" ")])
100+
XCTAssertEqual(ident.description, "\nfoo ")
101+
102+
let identSyntax = Syntax(raw: ident.raw).as(TokenSyntax.self)!
103+
let barIdentSyntax = identSyntax.withKind(.contextualKeyword("open"))
104+
let barIdent = barIdentSyntax.raw.as(RawTokenSyntax.self)!
105+
106+
XCTAssertEqual(barIdent.tokenKind, .contextualKeyword)
107+
XCTAssertEqual(barIdent.tokenText, "open")
108+
XCTAssertEqual(barIdent.leadingTriviaPieces, [.unexpectedText("\n")])
109+
XCTAssertEqual(barIdent.trailingTriviaPieces, [.unexpectedText(" ")])
110+
XCTAssertEqual(barIdent.description, "\nopen ")
111+
}
112+
}
84113
}

0 commit comments

Comments
 (0)