Skip to content

Commit 70eaab1

Browse files
authored
Merge pull request #839 from akyrtzi/pr/created-parsed-tokentext
Introduce `RawTokenSyntax(kind:, tokenText:, ...)` for a convenient way to create a token without any trivia
2 parents a2af7da + 60bd837 commit 70eaab1

File tree

2 files changed

+35
-5
lines changed

2 files changed

+35
-5
lines changed

Sources/SwiftParser/Expressions.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,7 +1474,6 @@ extension Parser {
14741474
let segmentToken = RawTokenSyntax(
14751475
kind: .stringSegment,
14761476
text: SyntaxText(rebasing: text[stringLiteralSegmentStart..<slashIndex]),
1477-
leadingTriviaPieces: [], trailingTriviaPieces: [],
14781477
presence: .present,
14791478
arena: self.arena)
14801479
segments.append(RawSyntax(RawStringSegmentSyntax(content: segmentToken, arena: self.arena)))
@@ -1490,7 +1489,6 @@ extension Parser {
14901489
let slashToken = RawTokenSyntax(
14911490
kind: .backslash,
14921491
text: SyntaxText(rebasing: text[slashIndex..<text.index(after: slashIndex)]),
1493-
leadingTriviaPieces: [], trailingTriviaPieces: [],
14941492
presence: .present,
14951493
arena: self.arena)
14961494

@@ -1500,7 +1498,6 @@ extension Parser {
15001498
delim = RawTokenSyntax(
15011499
kind: .rawStringDelimiter,
15021500
text: SyntaxText(rebasing: text[delimiterStart..<contentStart]),
1503-
leadingTriviaPieces: [], trailingTriviaPieces: [],
15041501
presence: .present,
15051502
arena: self.arena)
15061503
} else {
@@ -1567,7 +1564,6 @@ extension Parser {
15671564
let segmentToken = RawTokenSyntax(
15681565
kind: .stringSegment,
15691566
text: SyntaxText(rebasing: segment),
1570-
leadingTriviaPieces: [], trailingTriviaPieces: [],
15711567
presence: .present,
15721568
arena: self.arena)
15731569
segments.append(RawSyntax(RawStringSegmentSyntax(content: segmentToken,

Sources/SwiftSyntax/Raw/RawSyntaxNodeProtocol.swift

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,37 @@ public struct RawTokenSyntax: RawSyntaxToSyntax, RawSyntaxNodeProtocol {
140140
public init(
141141
kind: RawTokenKind,
142142
text: SyntaxText,
143+
leadingTriviaPieces: [RawTriviaPiece] = [],
144+
trailingTriviaPieces: [RawTriviaPiece] = [],
145+
presence: SourcePresence,
146+
arena: __shared SyntaxArena
147+
) {
148+
if leadingTriviaPieces.isEmpty && trailingTriviaPieces.isEmpty {
149+
// Create it via `RawSyntax.parsedToken()`.
150+
self.init(
151+
kind: kind,
152+
wholeText: text,
153+
textRange: 0 ..< text.count,
154+
presence: presence,
155+
arena: arena
156+
)
157+
} else {
158+
// Create it via `RawSyntax.makeMaterializedToken()`.
159+
self.init(
160+
materialized: kind,
161+
text: text,
162+
leadingTriviaPieces: leadingTriviaPieces,
163+
trailingTriviaPieces: trailingTriviaPieces,
164+
presence: presence,
165+
arena: arena
166+
)
167+
}
168+
}
169+
170+
/// Creates a `MaterializedToken`. Trivia must be managed by the same `arena`.
171+
fileprivate init(
172+
materialized kind: RawTokenKind,
173+
text: SyntaxText,
143174
leadingTriviaPieces: [RawTriviaPiece],
144175
trailingTriviaPieces: [RawTriviaPiece],
145176
presence: SourcePresence,
@@ -169,8 +200,11 @@ public struct RawTokenSyntax: RawSyntaxToSyntax, RawSyntaxNodeProtocol {
169200
text: SyntaxText? = nil,
170201
arena: __shared SyntaxArena
171202
) {
203+
// FIXME: Allow creating a `RawSyntax.parsedToken()` with a string literal
204+
// for text. Currently it asserts that the string buffer is not contained
205+
// within the `arena`.
172206
self.init(
173-
kind: kind,
207+
materialized: kind,
174208
text: text ?? kind.defaultText ?? "",
175209
leadingTriviaPieces: [],
176210
trailingTriviaPieces: [],

0 commit comments

Comments
 (0)