Skip to content

Commit bd93fbd

Browse files
committed
Replace TokenSpec.swiftKind by varOrCaseName
1 parent 22a594a commit bd93fbd

File tree

11 files changed

+145
-147
lines changed

11 files changed

+145
-147
lines changed

CodeGeneration/Sources/SyntaxSupport/GrammarGenerator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ struct GrammarGenerator {
2323
if let tokenText = token.text {
2424
return "`'\(tokenText)'`"
2525
} else {
26-
return "`<\(token.swiftKind)>`"
26+
return "`<\(token.varOrCaseName)>`"
2727
}
2828
}
2929
}

CodeGeneration/Sources/SyntaxSupport/TokenSpec.swift

Lines changed: 54 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
import SwiftSyntax
14+
1315
/// Represents the specification for a Token in the TokenSyntax file.
1416
public struct TokenSpec {
1517
public enum Kind {
@@ -19,22 +21,18 @@ public struct TokenSpec {
1921
case other
2022
}
2123

22-
public let name: String
24+
public let varOrCaseName: TokenSyntax
2325
public let nameForDiagnostics: String
2426
public let text: String?
2527
public let kind: Kind
2628

27-
public var swiftKind: String {
28-
return lowercaseFirstWord(name: self.name)
29-
}
30-
3129
fileprivate init(
3230
name: String,
3331
nameForDiagnostics: String,
3432
text: String? = nil,
3533
kind: Kind
3634
) {
37-
self.name = name
35+
self.varOrCaseName = .identifier(name)
3836
self.nameForDiagnostics = nameForDiagnostics
3937
self.text = text
4038
self.kind = kind
@@ -69,57 +67,57 @@ public struct TokenSpec {
6967
}
7068

7169
public let SYNTAX_TOKENS: [TokenSpec] = [
72-
.punctuator(name: "Arrow", text: "->"),
73-
.punctuator(name: "AtSign", text: "@"),
74-
.punctuator(name: "Backslash", text: "\\"),
75-
.punctuator(name: "Backtick", text: "`"),
76-
.other(name: "BinaryOperator", nameForDiagnostics: "binary operator"),
77-
.punctuator(name: "Colon", text: ":"),
78-
.punctuator(name: "Comma", text: ","),
79-
.other(name: "DollarIdentifier", nameForDiagnostics: "dollar identifier"),
80-
.punctuator(name: "Ellipsis", text: "..."),
81-
.other(name: "EndOfFile", nameForDiagnostics: "end of file", text: ""),
82-
.punctuator(name: "Equal", text: "="),
83-
.punctuator(name: "ExclamationMark", text: "!"),
84-
.other(name: "ExtendedRegexDelimiter", nameForDiagnostics: "extended delimiter"),
85-
.other(name: "FloatingLiteral", nameForDiagnostics: "floating literal"),
86-
.other(name: "Identifier", nameForDiagnostics: "identifier"),
87-
.punctuator(name: "InfixQuestionMark", text: "?"),
88-
.other(name: "IntegerLiteral", nameForDiagnostics: "integer literal"),
89-
TokenSpec(name: "Keyword", nameForDiagnostics: "keyword", text: nil, kind: .keyword),
90-
.punctuator(name: "LeftAngle", text: "<"),
91-
.punctuator(name: "LeftBrace", text: "{"),
92-
.punctuator(name: "LeftParen", text: "("),
93-
.punctuator(name: "LeftSquare", text: "["),
94-
.punctuator(name: "MultilineStringQuote", text: "\"\"\""),
95-
.punctuator(name: "Period", text: "."),
96-
.other(name: "PostfixOperator", nameForDiagnostics: "postfix operator"),
97-
.punctuator(name: "PostfixQuestionMark", text: "?"),
98-
.punctuator(name: "Pound", text: "#"),
99-
.poundKeyword(name: "PoundAvailable", text: "#available"),
100-
.poundKeyword(name: "PoundElse", text: "#else"),
101-
.poundKeyword(name: "PoundElseif", text: "#elseif"),
102-
.poundKeyword(name: "PoundEndif", text: "#endif"),
103-
.poundKeyword(name: "PoundIf", text: "#if"),
104-
.poundKeyword(name: "PoundSourceLocation", text: "#sourceLocation"),
105-
.poundKeyword(name: "PoundUnavailable", text: "#unavailable"),
106-
.punctuator(name: "PrefixAmpersand", text: "&"),
107-
.other(name: "PrefixOperator", nameForDiagnostics: "prefix operator"),
108-
.other(name: "RawStringDelimiter", nameForDiagnostics: "raw string delimiter"),
109-
.other(name: "RegexLiteralPattern", nameForDiagnostics: "regex pattern"),
110-
.punctuator(name: "RegexSlash", text: "/"),
111-
.punctuator(name: "RightAngle", text: ">"),
112-
.punctuator(name: "RightBrace", text: "}"),
113-
.punctuator(name: "RightParen", text: ")"),
114-
.punctuator(name: "RightSquare", text: "]"),
115-
.punctuator(name: "Semicolon", text: ";"),
116-
.punctuator(name: "SingleQuote", text: "\'"),
117-
.punctuator(name: "StringQuote", text: "\""),
118-
.other(name: "StringSegment", nameForDiagnostics: "string segment"),
119-
.other(name: "Unknown", nameForDiagnostics: "token"),
120-
.other(name: "Wildcard", nameForDiagnostics: "wildcard", text: "_"),
70+
.punctuator(name: "arrow", text: "->"),
71+
.punctuator(name: "atSign", text: "@"),
72+
.punctuator(name: "backslash", text: "\\"),
73+
.punctuator(name: "backtick", text: "`"),
74+
.other(name: "binaryOperator", nameForDiagnostics: "binary operator"),
75+
.punctuator(name: "colon", text: ":"),
76+
.punctuator(name: "comma", text: ","),
77+
.other(name: "dollarIdentifier", nameForDiagnostics: "dollar identifier"),
78+
.punctuator(name: "ellipsis", text: "..."),
79+
.other(name: "endOfFile", nameForDiagnostics: "end of file", text: ""),
80+
.punctuator(name: "equal", text: "="),
81+
.punctuator(name: "exclamationMark", text: "!"),
82+
.other(name: "extendedRegexDelimiter", nameForDiagnostics: "extended delimiter"),
83+
.other(name: "floatingLiteral", nameForDiagnostics: "floating literal"),
84+
.other(name: "identifier", nameForDiagnostics: "identifier"),
85+
.punctuator(name: "infixQuestionMark", text: "?"),
86+
.other(name: "integerLiteral", nameForDiagnostics: "integer literal"),
87+
TokenSpec(name: "keyword", nameForDiagnostics: "keyword", text: nil, kind: .keyword),
88+
.punctuator(name: "leftAngle", text: "<"),
89+
.punctuator(name: "leftBrace", text: "{"),
90+
.punctuator(name: "leftParen", text: "("),
91+
.punctuator(name: "leftSquare", text: "["),
92+
.punctuator(name: "multilineStringQuote", text: "\"\"\""),
93+
.punctuator(name: "period", text: "."),
94+
.other(name: "postfixOperator", nameForDiagnostics: "postfix operator"),
95+
.punctuator(name: "postfixQuestionMark", text: "?"),
96+
.punctuator(name: "pound", text: "#"),
97+
.poundKeyword(name: "poundAvailable", text: "#available"),
98+
.poundKeyword(name: "poundElse", text: "#else"),
99+
.poundKeyword(name: "poundElseif", text: "#elseif"),
100+
.poundKeyword(name: "poundEndif", text: "#endif"),
101+
.poundKeyword(name: "poundIf", text: "#if"),
102+
.poundKeyword(name: "poundSourceLocation", text: "#sourceLocation"),
103+
.poundKeyword(name: "poundUnavailable", text: "#unavailable"),
104+
.punctuator(name: "prefixAmpersand", text: "&"),
105+
.other(name: "prefixOperator", nameForDiagnostics: "prefix operator"),
106+
.other(name: "rawStringDelimiter", nameForDiagnostics: "raw string delimiter"),
107+
.other(name: "regexLiteralPattern", nameForDiagnostics: "regex pattern"),
108+
.punctuator(name: "regexSlash", text: "/"),
109+
.punctuator(name: "rightAngle", text: ">"),
110+
.punctuator(name: "rightBrace", text: "}"),
111+
.punctuator(name: "rightParen", text: ")"),
112+
.punctuator(name: "rightSquare", text: "]"),
113+
.punctuator(name: "semicolon", text: ";"),
114+
.punctuator(name: "singleQuote", text: "\'"),
115+
.punctuator(name: "stringQuote", text: "\""),
116+
.other(name: "stringSegment", nameForDiagnostics: "string segment"),
117+
.other(name: "unknown", nameForDiagnostics: "token"),
118+
.other(name: "wildcard", nameForDiagnostics: "wildcard", text: "_"),
121119
]
122120

123121
public let SYNTAX_TOKEN_MAP = Dictionary(
124-
uniqueKeysWithValues: SYNTAX_TOKENS.map { ("\($0.name)Token", $0) }
122+
uniqueKeysWithValues: SYNTAX_TOKENS.map { ("\($0.varOrCaseName.description.withFirstCharacterUppercased)Token", $0) }
125123
)

CodeGeneration/Sources/Utils/SyntaxBuildableChild.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public extension Child {
7272
return type.defaultValue.map { InitializerClauseSyntax(value: $0) }
7373
}
7474
if token.text != nil {
75-
return InitializerClauseSyntax(value: ExprSyntax(".\(raw: token.swiftKind)Token()"))
75+
return InitializerClauseSyntax(value: ExprSyntax(".\(token.varOrCaseName)Token()"))
7676
}
7777
guard case .token(let choices, _, _) = kind, choices.count == 1, token.kind == .keyword else {
7878
return nil
@@ -85,7 +85,7 @@ public extension Child {
8585
if textChoice == "init" {
8686
textChoice = "`init`"
8787
}
88-
return InitializerClauseSyntax(value: ExprSyntax(".\(raw: token.swiftKind)(.\(raw: textChoice))"))
88+
return InitializerClauseSyntax(value: ExprSyntax(".\(token.varOrCaseName)(.\(raw: textChoice))"))
8989
}
9090

9191
/// If this node is a token that can't contain arbitrary text, generate a Swift

CodeGeneration/Sources/Utils/SyntaxBuildableType.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public struct SyntaxBuildableType: Hashable {
6464
return ExprSyntax(NilLiteralExprSyntax())
6565
} else if let token = token {
6666
if token.text != nil {
67-
return ExprSyntax(".\(raw: lowercaseFirstWord(name: token.name))Token()")
67+
return ExprSyntax(".\(token.varOrCaseName)Token()")
6868
}
6969
}
7070
return nil

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ let parserTokenSpecSetFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
3030
DeclSyntax("case \(raw: keyword.escapedName)")
3131
case .token(let tokenText):
3232
let token = SYNTAX_TOKEN_MAP[tokenText]!
33-
DeclSyntax("case \(raw: token.swiftKind)")
33+
DeclSyntax("case \(token.varOrCaseName)")
3434
}
3535
}
3636

@@ -44,7 +44,7 @@ let parserTokenSpecSetFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
4444
case .token(let tokenText):
4545
let token = SYNTAX_TOKEN_MAP[tokenText]!
4646
SwitchCaseSyntax(
47-
"case TokenSpec(.\(raw: token.swiftKind)): self = .\(raw: token.swiftKind)"
47+
"case TokenSpec(.\(token.varOrCaseName)): self = .\(token.varOrCaseName)"
4848
)
4949
}
5050
}
@@ -64,7 +64,7 @@ let parserTokenSpecSetFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
6464
case .token(let tokenText):
6565
let token = SYNTAX_TOKEN_MAP[tokenText]!
6666
SwitchCaseSyntax(
67-
"case .\(raw: token.swiftKind): return .\(raw: token.swiftKind)"
67+
"case .\(token.varOrCaseName): return .\(token.varOrCaseName)"
6868
)
6969
}
7070
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ let tokenSpecStaticMembersFile = SourceFileSyntax(leadingTrivia: copyrightHeader
1919
DeclSyntax("@_spi(RawSyntax) import SwiftSyntax")
2020

2121
try! ExtensionDeclSyntax("extension TokenSpec") {
22-
for token in SYNTAX_TOKENS where token.swiftKind != "keyword" {
23-
DeclSyntax("static var \(raw: token.swiftKind): TokenSpec { return TokenSpec(.\(raw: token.swiftKind)) }")
22+
for token in SYNTAX_TOKENS where token.kind != .keyword {
23+
DeclSyntax("static var \(token.varOrCaseName): TokenSpec { return TokenSpec(.\(token.varOrCaseName)) }")
2424
}
2525

2626
DeclSyntax("static func keyword(_ keyword: Keyword) -> TokenSpec { return TokenSpec(keyword) }")

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftparserdiagnostics/TokenNameForDiagnosticsFile.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ let tokenNameForDiagnosticFile = SourceFileSyntax(leadingTrivia: copyrightHeader
2121
try! ExtensionDeclSyntax("extension TokenKind") {
2222
try! VariableDeclSyntax("var nameForDiagnostics: String") {
2323
try! SwitchExprSyntax("switch self") {
24-
for token in SYNTAX_TOKENS where token.swiftKind != "keyword" {
25-
SwitchCaseSyntax("case .\(raw: token.swiftKind):") {
26-
StmtSyntax("return #\"\(raw: token.nameForDiagnostics)\"#")
24+
for token in SYNTAX_TOKENS where token.kind != .keyword {
25+
SwitchCaseSyntax("case .\(token.varOrCaseName):") {
26+
StmtSyntax("return \(literal: token.nameForDiagnostics)")
2727
}
2828
}
2929
SwitchCaseSyntax("case .keyword(let keyword):") {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ let rawSyntaxValidationFile = try! SourceFileSyntax(leadingTrivia: copyrightHead
216216
case .keyword(text: let text):
217217
ArrayElementSyntax(expression: ExprSyntax(#".keyword("\#(raw: text)")"#))
218218
case .token(tokenKind: let tokenKind):
219-
ArrayElementSyntax(expression: ExprSyntax(".tokenKind(.\(raw: SYNTAX_TOKEN_MAP[tokenKind]!.swiftKind))"))
219+
ArrayElementSyntax(expression: ExprSyntax(".tokenKind(.\(SYNTAX_TOKEN_MAP[tokenKind]!.varOrCaseName))"))
220220
}
221221
}
222222
}

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

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ let tokenKindFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
2626
// Tokens that don't have a set text have an associated value that
2727
// contains their text.
2828
if token.kind == .keyword {
29-
DeclSyntax("case \(raw: token.swiftKind)(Keyword)")
29+
DeclSyntax("case \(token.varOrCaseName)(Keyword)")
3030
} else if token.text == nil {
31-
DeclSyntax("case \(raw: token.swiftKind)(String)")
31+
DeclSyntax("case \(token.varOrCaseName)(String)")
3232
} else {
33-
DeclSyntax("case \(raw: token.swiftKind)")
33+
DeclSyntax("case \(token.varOrCaseName)")
3434
}
3535
}
3636

@@ -44,15 +44,15 @@ let tokenKindFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
4444
try SwitchExprSyntax("switch self") {
4545
for token in SYNTAX_TOKENS {
4646
if token.kind == .keyword {
47-
SwitchCaseSyntax("case .\(raw: token.swiftKind)(let assoc):") {
47+
SwitchCaseSyntax("case .\(token.varOrCaseName)(let assoc):") {
4848
StmtSyntax("return String(syntaxText: assoc.defaultText)")
4949
}
5050
} else if let text = token.text {
51-
SwitchCaseSyntax("case .\(raw: token.swiftKind):") {
51+
SwitchCaseSyntax("case .\(token.varOrCaseName):") {
5252
StmtSyntax("return #\"\(raw: text)\"#")
5353
}
5454
} else {
55-
SwitchCaseSyntax("case .\(raw: token.swiftKind)(let text):") {
55+
SwitchCaseSyntax("case .\(token.varOrCaseName)(let text):") {
5656
StmtSyntax("return text")
5757
}
5858
}
@@ -70,11 +70,11 @@ let tokenKindFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
7070
try SwitchExprSyntax("switch self") {
7171
for token in SYNTAX_TOKENS {
7272
if token.kind == .keyword {
73-
SwitchCaseSyntax("case .\(raw: token.swiftKind)(let assoc):") {
73+
SwitchCaseSyntax("case .\(token.varOrCaseName)(let assoc):") {
7474
StmtSyntax("return assoc.defaultText")
7575
}
7676
} else if let text = token.text {
77-
SwitchCaseSyntax("case .\(raw: token.swiftKind):") {
77+
SwitchCaseSyntax("case .\(token.varOrCaseName):") {
7878
StmtSyntax("return #\"\(raw: text)\"#")
7979
}
8080
}
@@ -98,7 +98,7 @@ let tokenKindFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
9898
) {
9999
try SwitchExprSyntax("switch self") {
100100
for token in SYNTAX_TOKENS {
101-
SwitchCaseSyntax("case .\(raw: token.swiftKind):") {
101+
SwitchCaseSyntax("case .\(token.varOrCaseName):") {
102102
StmtSyntax("return \(raw: token.kind == .punctuation)")
103103
}
104104
}
@@ -111,11 +111,11 @@ let tokenKindFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
111111
try SwitchExprSyntax("switch (lhs, rhs)") {
112112
for token in SYNTAX_TOKENS {
113113
if token.text != nil {
114-
SwitchCaseSyntax("case (.\(raw: token.swiftKind), .\(raw: token.swiftKind)):") {
114+
SwitchCaseSyntax("case (.\(token.varOrCaseName), .\(token.varOrCaseName)):") {
115115
StmtSyntax("return true")
116116
}
117117
} else {
118-
SwitchCaseSyntax("case (.\(raw: token.swiftKind)(let lhsText), .\(raw: token.swiftKind)(let rhsText)):") {
118+
SwitchCaseSyntax("case (.\(token.varOrCaseName)(let lhsText), .\(token.varOrCaseName)(let rhsText)):") {
119119
StmtSyntax("return lhsText == rhsText")
120120
}
121121
}
@@ -140,7 +140,7 @@ let tokenKindFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
140140
"""
141141
) {
142142
for token in SYNTAX_TOKENS {
143-
DeclSyntax("case \(raw: token.swiftKind)")
143+
DeclSyntax("case \(token.varOrCaseName)")
144144
}
145145

146146
try VariableDeclSyntax(
@@ -152,7 +152,7 @@ let tokenKindFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
152152
try! SwitchExprSyntax("switch self") {
153153
for token in SYNTAX_TOKENS {
154154
if let text = token.text {
155-
SwitchCaseSyntax("case .\(raw: token.swiftKind):") {
155+
SwitchCaseSyntax("case .\(token.varOrCaseName):") {
156156
StmtSyntax("return #\"\(raw: text)\"#")
157157
}
158158
}
@@ -176,7 +176,7 @@ let tokenKindFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
176176
) {
177177
try! SwitchExprSyntax("switch self") {
178178
for token in SYNTAX_TOKENS {
179-
SwitchCaseSyntax("case .\(raw: token.swiftKind):") {
179+
SwitchCaseSyntax("case .\(token.varOrCaseName):") {
180180
StmtSyntax("return \(raw: token.kind == .punctuation)")
181181
}
182182
}
@@ -194,8 +194,8 @@ let tokenKindFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
194194
) {
195195
try! SwitchExprSyntax("switch rawKind") {
196196
for token in SYNTAX_TOKENS {
197-
if token.swiftKind == "keyword" {
198-
SwitchCaseSyntax("case .\(raw: token.swiftKind):") {
197+
if token.kind == .keyword {
198+
SwitchCaseSyntax("case .\(token.varOrCaseName):") {
199199
DeclSyntax("var text = text")
200200
StmtSyntax(
201201
"""
@@ -206,13 +206,13 @@ let tokenKindFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
206206
)
207207
}
208208
} else if token.text != nil {
209-
SwitchCaseSyntax("case .\(raw: token.swiftKind):") {
209+
SwitchCaseSyntax("case .\(token.varOrCaseName):") {
210210
ExprSyntax("precondition(text.isEmpty || rawKind.defaultText.map(String.init) == text)")
211-
StmtSyntax("return .\(raw: token.swiftKind)")
211+
StmtSyntax("return .\(token.varOrCaseName)")
212212
}
213213
} else {
214-
SwitchCaseSyntax("case .\(raw: token.swiftKind):") {
215-
StmtSyntax("return .\(raw: token.swiftKind)(text)")
214+
SwitchCaseSyntax("case .\(token.varOrCaseName):") {
215+
StmtSyntax("return .\(token.varOrCaseName)(text)")
216216
}
217217
}
218218
}
@@ -229,17 +229,17 @@ let tokenKindFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
229229
) {
230230
try! SwitchExprSyntax("switch self") {
231231
for token in SYNTAX_TOKENS {
232-
if token.swiftKind == "keyword" {
233-
SwitchCaseSyntax("case .\(raw: token.swiftKind)(let keyword):") {
234-
StmtSyntax("return (.\(raw: token.swiftKind), String(syntaxText: keyword.defaultText))")
232+
if token.kind == .keyword {
233+
SwitchCaseSyntax("case .\(token.varOrCaseName)(let keyword):") {
234+
StmtSyntax("return (.\(token.varOrCaseName), String(syntaxText: keyword.defaultText))")
235235
}
236236
} else if token.text != nil {
237-
SwitchCaseSyntax("case .\(raw: token.swiftKind):") {
238-
StmtSyntax("return (.\(raw: token.swiftKind), nil)")
237+
SwitchCaseSyntax("case .\(token.varOrCaseName):") {
238+
StmtSyntax("return (.\(token.varOrCaseName), nil)")
239239
}
240240
} else {
241-
SwitchCaseSyntax("case .\(raw: token.swiftKind)(let str):") {
242-
StmtSyntax("return (.\(raw: token.swiftKind), str)")
241+
SwitchCaseSyntax("case .\(token.varOrCaseName)(let str):") {
242+
StmtSyntax("return (.\(token.varOrCaseName), str)")
243243
}
244244
}
245245
}

0 commit comments

Comments
 (0)