Skip to content

Commit 83a9132

Browse files
committed
Introduce varOrCaseName property on KeywordSpec
1 parent 84f2805 commit 83a9132

File tree

11 files changed

+378
-384
lines changed

11 files changed

+378
-384
lines changed

CodeGeneration/Sources/SyntaxSupport/KeywordSpec.swift

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@ public struct KeywordSpec {
2525
/// Indicates if the token kind is switched from being an identifier to a keyword in the lexer.
2626
public let isLexerClassified: Bool
2727

28-
/// The escaped name of the keyword.
29-
///
30-
/// This is useful when the keyword is also an identifier or has special characters that need escaping.
31-
public var escapedName: String {
32-
if isLexerClassified || name == "Type" || name == "Protocol" {
33-
return "`\(name)`"
28+
/// The name of this keyword that's suitable to be used for variable or enum case names.
29+
public var varOrCaseName: TokenSyntax {
30+
if name == "init" {
31+
return "`init`"
3432
} else {
35-
return name
33+
return TokenSyntax.identifier(name)
3634
}
3735
}
3836

CodeGeneration/Sources/SyntaxSupport/String+Extensions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public extension StringProtocol {
1515
var withFirstCharacterUppercased: String { prefix(1).uppercased() + dropFirst() }
1616
var backtickedIfNeeded: String {
1717
if Keyword.allCases.map(\.spec).contains(where: {
18-
$0.name == self && $0.isLexerClassified
18+
$0.name == self && ($0.isLexerClassified || $0.name == "Type" || $0.name == "Protocol")
1919
}) {
2020
return "`\(self)`"
2121
} else {

CodeGeneration/Sources/SyntaxSupport/Utils.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public extension Collection {
6969
public extension TokenSyntax {
7070
var backtickedIfNeeded: TokenSyntax {
7171
if Keyword.allCases.map(\.spec).contains(where: {
72-
$0.name == self.description && $0.isLexerClassified
72+
$0.name == self.description && ($0.isLexerClassified || $0.name == "Type" || $0.name == "Protocol")
7373
}) {
7474
return "`\(self)`"
7575
} else {

CodeGeneration/Sources/Utils/SyntaxBuildableChild.swift

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,7 @@ public extension Child {
7777
if case .token(let choices, _, _) = kind,
7878
case .keyword(let keyword) = choices.only
7979
{
80-
var name = keyword.spec.name
81-
if keyword == .`init` {
82-
name = "`init`"
83-
}
84-
return ExprSyntax(".\(token.varOrCaseName)(.\(raw: name))")
80+
return ExprSyntax(".\(token.varOrCaseName)(.\(keyword.spec.varOrCaseName))")
8581
}
8682
return nil
8783
}

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftparser/IsLexerClassifiedFile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ let isLexerClassifiedFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
3333
try! SwitchExprSyntax("switch self") {
3434
for keyword in Keyword.allCases {
3535
if keyword.spec.isLexerClassified {
36-
SwitchCaseSyntax("case .\(raw: keyword.spec.escapedName): return true")
36+
SwitchCaseSyntax("case .\(keyword.spec.varOrCaseName): return true")
3737
}
3838
}
3939
SwitchCaseSyntax("default: return false")

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ let parserTokenSpecSetFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
3434
DeclSyntax(
3535
"""
3636
\(keyword.spec.apiAttributes)\
37-
case \(raw: keyword.spec.escapedName)
37+
case \(keyword.spec.varOrCaseName.backtickedIfNeeded)
3838
"""
3939
)
4040
case .token(let token):
@@ -47,8 +47,8 @@ let parserTokenSpecSetFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
4747
for choice in choices {
4848
switch choice {
4949
case .keyword(let keyword):
50-
let escapedName = keyword.spec.escapedName
51-
SwitchCaseSyntax("case TokenSpec(.\(raw: escapedName)): self = .\(raw: escapedName)")
50+
let caseName = keyword.spec.varOrCaseName
51+
SwitchCaseSyntax("case TokenSpec(.\(caseName)): self = .\(caseName)")
5252
case .token(let token):
5353
let caseName = token.spec.varOrCaseName
5454
SwitchCaseSyntax("case TokenSpec(.\(caseName)): self = .\(caseName)")
@@ -63,8 +63,8 @@ let parserTokenSpecSetFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
6363
for choice in choices {
6464
switch choice {
6565
case .keyword(let keyword):
66-
let escapedName = keyword.spec.escapedName
67-
SwitchCaseSyntax("case .\(raw: escapedName): return .keyword(.\(raw: escapedName))")
66+
let caseName = keyword.spec.varOrCaseName
67+
SwitchCaseSyntax("case .\(caseName): return .keyword(.\(caseName))")
6868
case .token(let token):
6969
let caseName = token.spec.varOrCaseName
7070
SwitchCaseSyntax("case .\(caseName): return .\(caseName)")
@@ -86,8 +86,8 @@ let parserTokenSpecSetFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
8686
for choice in choices {
8787
switch choice {
8888
case .keyword(let keyword):
89-
let escapedName = keyword.spec.escapedName
90-
SwitchCaseSyntax("case .\(raw: escapedName): return .keyword(.\(raw: escapedName))")
89+
let caseName = keyword.spec.varOrCaseName
90+
SwitchCaseSyntax("case .\(caseName): return .keyword(.\(caseName))")
9191
case .token(let token):
9292
let caseName = token.spec.varOrCaseName
9393
if token.spec.text != nil {

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntax/KeywordFile.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ let keywordFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
3131
DeclSyntax(
3232
"""
3333
\(keyword.spec.apiAttributes)\
34-
case \(raw: keyword.spec.escapedName)
34+
case \(keyword.spec.varOrCaseName.backtickedIfNeeded)
3535
"""
3636
)
3737
}
@@ -42,8 +42,8 @@ let keywordFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
4242
SwitchCaseSyntax("case \(raw: length):") {
4343
try! SwitchExprSyntax("switch text") {
4444
for keyword in keywords {
45-
SwitchCaseSyntax(#"case "\#(raw: keyword.name)":"#) {
46-
ExprSyntax("self = .\(raw: keyword.escapedName)")
45+
SwitchCaseSyntax("case \(literal: keyword.name):") {
46+
ExprSyntax("self = .\(keyword.varOrCaseName)")
4747
}
4848
}
4949
SwitchCaseSyntax("default: return nil")

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntax/RawSyntaxValidationFile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ let rawSyntaxValidationFile = try! SourceFileSyntax(leadingTrivia: copyrightHead
214214
for choice in choices {
215215
switch choice {
216216
case .keyword(let keyword):
217-
ArrayElementSyntax(expression: ExprSyntax(#".keyword("\#(raw: keyword.spec.name)")"#))
217+
ArrayElementSyntax(expression: ExprSyntax(".keyword(\(literal: keyword.spec.name))"))
218218
case .token(let token):
219219
ArrayElementSyntax(expression: ExprSyntax(".tokenKind(.\(token.spec.varOrCaseName))"))
220220
}

Sources/SwiftParser/generated/IsLexerClassified.swift

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -19,111 +19,111 @@ extension Keyword {
1919
/// This is true for keywords that used to be considered non-contextual.
2020
var isLexerClassified: Bool {
2121
switch self {
22-
case .`Any`:
22+
case .Any:
2323
return true
24-
case .`as`:
24+
case .as:
2525
return true
26-
case .`associatedtype`:
26+
case .associatedtype:
2727
return true
28-
case .`break`:
28+
case .break:
2929
return true
30-
case .`case`:
30+
case .case:
3131
return true
32-
case .`catch`:
32+
case .catch:
3333
return true
34-
case .`class`:
34+
case .class:
3535
return true
36-
case .`continue`:
36+
case .continue:
3737
return true
38-
case .`default`:
38+
case .default:
3939
return true
40-
case .`defer`:
40+
case .defer:
4141
return true
42-
case .`deinit`:
42+
case .deinit:
4343
return true
44-
case .`do`:
44+
case .do:
4545
return true
46-
case .`else`:
46+
case .else:
4747
return true
48-
case .`enum`:
48+
case .enum:
4949
return true
50-
case .`extension`:
50+
case .extension:
5151
return true
52-
case .`fallthrough`:
52+
case .fallthrough:
5353
return true
54-
case .`false`:
54+
case .false:
5555
return true
56-
case .`fileprivate`:
56+
case .fileprivate:
5757
return true
58-
case .`for`:
58+
case .for:
5959
return true
60-
case .`func`:
60+
case .func:
6161
return true
62-
case .`guard`:
62+
case .guard:
6363
return true
64-
case .`if`:
64+
case .if:
6565
return true
66-
case .`import`:
66+
case .import:
6767
return true
68-
case .`in`:
68+
case .in:
6969
return true
7070
case .`init`:
7171
return true
72-
case .`inout`:
72+
case .inout:
7373
return true
74-
case .`internal`:
74+
case .internal:
7575
return true
76-
case .`is`:
76+
case .is:
7777
return true
78-
case .`let`:
78+
case .let:
7979
return true
80-
case .`nil`:
80+
case .nil:
8181
return true
82-
case .`operator`:
82+
case .operator:
8383
return true
84-
case .`precedencegroup`:
84+
case .precedencegroup:
8585
return true
86-
case .`private`:
86+
case .private:
8787
return true
88-
case .`protocol`:
88+
case .protocol:
8989
return true
90-
case .`public`:
90+
case .public:
9191
return true
92-
case .`repeat`:
92+
case .repeat:
9393
return true
94-
case .`rethrows`:
94+
case .rethrows:
9595
return true
96-
case .`return`:
96+
case .return:
9797
return true
98-
case .`self`:
98+
case .self:
9999
return true
100-
case .`Self`:
100+
case .Self:
101101
return true
102-
case .`static`:
102+
case .static:
103103
return true
104-
case .`struct`:
104+
case .struct:
105105
return true
106-
case .`subscript`:
106+
case .subscript:
107107
return true
108-
case .`super`:
108+
case .super:
109109
return true
110-
case .`switch`:
110+
case .switch:
111111
return true
112-
case .`throw`:
112+
case .throw:
113113
return true
114-
case .`throws`:
114+
case .throws:
115115
return true
116-
case .`true`:
116+
case .true:
117117
return true
118-
case .`try`:
118+
case .try:
119119
return true
120-
case .`typealias`:
120+
case .typealias:
121121
return true
122-
case .`var`:
122+
case .var:
123123
return true
124-
case .`where`:
124+
case .where:
125125
return true
126-
case .`while`:
126+
case .while:
127127
return true
128128
default:
129129
return false

0 commit comments

Comments
 (0)