Skip to content

Commit 41478f4

Browse files
committed
Refactor the logic to parse the accessor modifier list
1 parent 1281ae4 commit 41478f4

File tree

4 files changed

+33
-5
lines changed

4 files changed

+33
-5
lines changed

Sources/SwiftParser/Declarations.swift

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1658,25 +1658,47 @@ extension Parser {
16581658

16591659
struct AccessorIntroducer {
16601660
var attributes: RawAttributeListSyntax
1661-
var modifiers: RawDeclModifierListSyntax
1661+
var modifiers: RawDeclModifierListSyntax?
16621662
var kind: AccessorDeclSyntax.AccessorSpecifierOptions
16631663
var unexpectedBeforeToken: RawUnexpectedNodesSyntax?
16641664
var token: RawTokenSyntax
16651665
}
16661666

1667+
mutating func parseAccessorModifierList(count: Int) -> RawDeclModifierListSyntax? {
1668+
if count == 0 { return nil }
1669+
1670+
var elements = [RawDeclModifierSyntax]()
1671+
1672+
for _ in 0..<count {
1673+
let (unexpectedBeforeName, name) = self.expect(anyIn: AccessorModifier.self, default: .mutating)
1674+
let modifier = RawDeclModifierSyntax(
1675+
unexpectedBeforeName,
1676+
name: name,
1677+
detail: nil,
1678+
arena: self.arena
1679+
)
1680+
elements.append(modifier)
1681+
}
1682+
1683+
return RawDeclModifierListSyntax(
1684+
elements: elements,
1685+
arena: self.arena
1686+
)
1687+
}
1688+
16671689
mutating func parseAccessorIntroducer(
16681690
forcedKind: (AccessorDeclSyntax.AccessorSpecifierOptions, TokenConsumptionHandle)? = nil
16691691
) -> AccessorIntroducer? {
16701692
// Look ahead to verify attributes/modifiers/kind
16711693
var look = self.lookahead()
16721694
let _ = look.consumeAttributeList()
1673-
let _ = look.consume(anySequence: AccessorModifier.self)
1695+
let modifierCount = look.consume(anySequence: AccessorModifier.self)
16741696
guard let (kind, _) = look.at(anyIn: AccessorDeclSyntax.AccessorSpecifierOptions.self) ?? forcedKind else {
16751697
return nil
16761698
}
16771699

16781700
let attrs = self.parseAttributeList()
1679-
let modifiers = self.parseDeclModifierList()
1701+
let modifiers = self.parseAccessorModifierList(count: modifierCount)
16801702

16811703
let (unexpectedBeforeIntroducer, introducer) = self.expect(kind.spec)
16821704

Sources/SwiftParser/Lookahead.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,12 @@ extension Parser.Lookahead {
163163
// MARK: Skipping a sequence of tokens
164164

165165
extension Parser.Lookahead {
166-
mutating func consume<SpecSet: TokenSpecSet>(anySequence: SpecSet.Type) {
166+
mutating func consume<SpecSet: TokenSpecSet>(anySequence: SpecSet.Type) -> Int {
167+
var count = 0
167168
while consume(ifAnyIn: SpecSet.self) != nil {
169+
count += 1
168170
}
171+
return count
169172
}
170173
}
171174

Sources/SwiftParser/TokenSpecSet.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ enum AccessorModifier: TokenSpecSet {
6666
case borrowing
6767
case mutating
6868
case nonmutating
69+
case yielding
6970

7071
init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) {
7172
switch PrepareForKeywordMatch(lexeme) {
@@ -74,6 +75,7 @@ enum AccessorModifier: TokenSpecSet {
7475
case TokenSpec(.borrowing): self = .borrowing
7576
case TokenSpec(.mutating): self = .mutating
7677
case TokenSpec(.nonmutating): self = .nonmutating
78+
case TokenSpec(.yielding): self = .yielding
7779
default: return nil
7880
}
7981
}
@@ -85,6 +87,7 @@ enum AccessorModifier: TokenSpecSet {
8587
case .borrowing: return .keyword(.borrowing)
8688
case .mutating: return .keyword(.mutating)
8789
case .nonmutating: return .keyword(.nonmutating)
90+
case .yielding: return .keyword(.yielding)
8891
}
8992
}
9093
}

Tests/SwiftParserTest/DeclarationTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3481,7 +3481,7 @@ final class DeclarationTests: ParserTestCase {
34813481
}
34823482
}
34833483
""",
3484-
experimentalFeatures: .coroutineAccessors
3484+
experimentalFeatures: [.coroutineAccessors, .borrowAndMutateAccessors]
34853485
)
34863486
assertParse(
34873487
"""

0 commit comments

Comments
 (0)