Skip to content

Commit 4dd7bc7

Browse files
committed
Replace the manually maintained TokenSpecSet TypeSpecifier by the generated TypeSpecifierSyntax.SpecifierOptions
The two `TokenSpecSet`s had already diverged. Instead of manually maintaining the `TypeSpecifier` spec set, we should allow all keywors specified in the syntax tree definition.
1 parent df3c4df commit 4dd7bc7

File tree

8 files changed

+869
-54
lines changed

8 files changed

+869
-54
lines changed

CodeGeneration/Sources/SyntaxSupport/Child.swift

+9
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ public enum TokenChoice: Equatable {
2424
case .token: return false
2525
}
2626
}
27+
28+
public var varOrCaseName: TokenSyntax {
29+
switch self {
30+
case .keyword(let keyword):
31+
return keyword.spec.varOrCaseName
32+
case .token(let token):
33+
return token.spec.varOrCaseName
34+
}
35+
}
2736
}
2837

2938
public enum ChildKind {

CodeGeneration/Sources/generate-swift-syntax/templates/swiftparser/ParserTokenSpecSetFile.swift

+11
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,17 @@ let parserTokenSpecSetFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
7070
}
7171
}
7272

73+
try InitializerDeclSyntax("public init?(token: TokenSyntax)") {
74+
try SwitchExprSyntax("switch token") {
75+
for choice in choices {
76+
SwitchCaseSyntax(
77+
"case TokenSpec(.\(choice.varOrCaseName)): self = .\(choice.varOrCaseName)"
78+
)
79+
}
80+
SwitchCaseSyntax("default: return nil")
81+
}
82+
}
83+
7384
try VariableDeclSyntax("var spec: TokenSpec") {
7485
try SwitchExprSyntax("switch self") {
7586
for choice in choices {

Sources/SwiftParser/Parameters.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ extension Parser {
261261
mutating func parseMisplacedSpecifiers() -> [RawTokenSyntax] {
262262
var misplacedSpecifiers: [RawTokenSyntax] = []
263263
if self.withLookahead({ !$0.startsParameterName(isClosure: false, allowMisplacedSpecifierRecovery: false) }) {
264-
while canHaveParameterSpecifier, let specifier = self.consume(ifAnyIn: TypeSpecifier.self) {
264+
while canHaveParameterSpecifier, let specifier = self.consume(ifAnyIn: TypeSpecifierSyntax.SpecifierOptions.self) {
265265
misplacedSpecifiers.append(specifier)
266266
}
267267
}

Sources/SwiftParser/Patterns.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ extension Parser.Lookahead {
326326
mutating func startsParameterName(isClosure: Bool, allowMisplacedSpecifierRecovery: Bool) -> Bool {
327327
if allowMisplacedSpecifierRecovery {
328328
while canHaveParameterSpecifier,
329-
self.consume(ifAnyIn: TypeSpecifier.self) != nil
329+
self.consume(ifAnyIn: TypeSpecifierSyntax.SpecifierOptions.self) != nil
330330
{}
331331
}
332332

Sources/SwiftParser/TokenSpecSet.swift

-46
Original file line numberDiff line numberDiff line change
@@ -684,52 +684,6 @@ enum TypeAttribute: TokenSpecSet {
684684
}
685685
}
686686

687-
@_spi(Diagnostics)
688-
public enum TypeSpecifier: TokenSpecSet {
689-
case `inout`
690-
case owned
691-
case shared
692-
case borrowing
693-
case consuming
694-
case transferring
695-
696-
init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) {
697-
switch PrepareForKeywordMatch(lexeme) {
698-
case TokenSpec(.inout): self = .inout
699-
case TokenSpec(.__owned): self = .owned
700-
case TokenSpec(.__shared): self = .shared
701-
case TokenSpec(.consuming): self = .consuming
702-
case TokenSpec(.borrowing): self = .borrowing
703-
case TokenSpec(.transferring): self = .transferring
704-
default: return nil
705-
}
706-
}
707-
708-
@_spi(Diagnostics)
709-
public init?(token: TokenSyntax) {
710-
switch token {
711-
case TokenSpec(.inout): self = .inout
712-
case TokenSpec(.__owned): self = .owned
713-
case TokenSpec(.__shared): self = .shared
714-
case TokenSpec(.consuming): self = .shared
715-
case TokenSpec(.borrowing): self = .shared
716-
case TokenSpec(.transferring): self = .transferring
717-
default: return nil
718-
}
719-
}
720-
721-
var spec: TokenSpec {
722-
switch self {
723-
case .inout: return .keyword(.inout)
724-
case .owned: return .keyword(.__owned)
725-
case .shared: return .keyword(.__shared)
726-
case .borrowing: return .keyword(.borrowing)
727-
case .consuming: return .keyword(.consuming)
728-
case .transferring: return .keyword(.transferring)
729-
}
730-
}
731-
}
732-
733687
// MARK: Expression start
734688

735689
enum ExpressionModifierKeyword: TokenSpecSet {

Sources/SwiftParser/Types.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ extension Parser {
457457
var misplacedSpecifiers: [RawTokenSyntax] = []
458458
if self.withLookahead({ $0.startsParameterName(isClosure: false, allowMisplacedSpecifierRecovery: true) }) {
459459
while canHaveParameterSpecifier,
460-
let specifier = self.consume(ifAnyIn: TypeSpecifier.self)
460+
let specifier = self.consume(ifAnyIn: TypeSpecifierSyntax.SpecifierOptions.self)
461461
{
462462
misplacedSpecifiers.append(specifier)
463463
}
@@ -612,7 +612,7 @@ extension Parser.Lookahead {
612612
var specifierProgress = LoopProgressCondition()
613613
// TODO: Can we model isolated/_const so that they're specified in both canParse* and parse*?
614614
while canHaveParameterSpecifier,
615-
self.at(anyIn: TypeSpecifier.self) != nil || self.at(.keyword(.isolated)) || self.at(.keyword(._const)),
615+
self.at(anyIn: TypeSpecifierSyntax.SpecifierOptions.self) != nil || self.at(.keyword(.isolated)) || self.at(.keyword(._const)),
616616
self.hasProgressed(&specifierProgress)
617617
{
618618
self.consumeAnyToken()

0 commit comments

Comments
 (0)