Skip to content

Commit 689efdf

Browse files
committed
Make Child.varName a TokenSyntax
1 parent 69c9c53 commit 689efdf

File tree

11 files changed

+71
-47
lines changed

11 files changed

+71
-47
lines changed

CodeGeneration/Sources/SyntaxSupport/Child.swift

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

13+
import SwiftSyntax
14+
1315
/// The kind of token a node can contain. Either a token of a specific kind or a
1416
/// keyword with the given text.
1517
public enum TokenChoice: Equatable {
@@ -77,16 +79,16 @@ public class Child {
7779
}
7880

7981
/// A name of this child that's suitable to be used for variable or enum case names.
80-
public var varName: String {
81-
return lowercaseFirstWord(name: name)
82+
public var varOrCaseName: TokenSyntax {
83+
return .identifier(lowercaseFirstWord(name: name))
8284
}
8385

8486
/// The deprecated name of this child that's suitable to be used for variable or enum case names.
85-
public var deprecatedVarName: String? {
87+
public var deprecatedVarName: TokenSyntax? {
8688
guard let deprecatedName = deprecatedName else {
8789
return nil
8890
}
89-
return lowercaseFirstWord(name: deprecatedName)
91+
return .identifier(lowercaseFirstWord(name: deprecatedName))
9092
}
9193

9294
/// If the child ends with "token" in the kind, it's considered a token node.

CodeGeneration/Sources/SyntaxSupport/GrammarGenerator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ struct GrammarGenerator {
5757
return
5858
children
5959
.filter { !$0.isUnexpectedNodes }
60-
.map { " - `\($0.varName)`: \(generator.grammar(for: $0))" }
60+
.map { " - `\($0.varOrCaseName)`: \(generator.grammar(for: $0))" }
6161
.joined(separator: "\n")
6262
}
6363
}

CodeGeneration/Sources/SyntaxSupport/Utils.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,15 @@ public extension Collection {
6565
}
6666
}
6767
}
68+
69+
public extension TokenSyntax {
70+
var backtickedIfNeeded: TokenSyntax {
71+
if KEYWORDS.contains(where: {
72+
$0.name == self.description && $0.isLexerClassified
73+
}) {
74+
return "`\(self)`"
75+
} else {
76+
return self
77+
}
78+
}
79+
}

CodeGeneration/Sources/generate-swiftsyntax/LayoutNode+Extensions.swift

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,18 @@ extension LayoutNode {
3939
}
4040
}
4141

42-
let parameterName: String
42+
let parameterName: TokenSyntax
4343

4444
if useDeprecatedChildName, let deprecatedVarName = child.deprecatedVarName {
4545
parameterName = deprecatedVarName
4646
} else {
47-
parameterName = child.varName
47+
parameterName = child.varOrCaseName
4848
}
4949

5050
return FunctionParameterSyntax(
5151
leadingTrivia: .newline,
52-
firstName: child.isUnexpectedNodes ? .wildcardToken(trailingTrivia: .space) : .identifier(parameterName),
53-
secondName: child.isUnexpectedNodes ? .identifier(parameterName) : nil,
52+
firstName: child.isUnexpectedNodes ? .wildcardToken(trailingTrivia: .space) : parameterName,
53+
secondName: child.isUnexpectedNodes ? parameterName : nil,
5454
colon: .colonToken(),
5555
type: paramType,
5656
defaultArgument: child.defaultInitialization
@@ -83,7 +83,7 @@ extension LayoutNode {
8383
return nil
8484
}
8585

86-
return " - \(child.varName): \(firstLine)"
86+
return " - \(child.varOrCaseName): \(firstLine)"
8787
}
8888

8989
let formattedParams = """
@@ -114,12 +114,12 @@ extension LayoutNode {
114114
for child in children {
115115
/// The expression that is used to call the default initializer defined above.
116116
let produceExpr: ExprSyntax
117-
let childName: String
117+
let childName: TokenSyntax
118118

119119
if useDeprecatedChildName, let deprecatedVarName = child.deprecatedVarName {
120120
childName = deprecatedVarName
121121
} else {
122-
childName = child.varName
122+
childName = child.varOrCaseName
123123
}
124124

125125
if child.type.isBuilderInitializable {
@@ -129,12 +129,12 @@ extension LayoutNode {
129129
if child.type.builderInitializableType != child.type {
130130
let param = Node.from(type: child.type).layoutNode!.singleNonDefaultedChild
131131
if child.isOptional {
132-
produceExpr = ExprSyntax("\(raw: childName)Builder().map { \(raw: child.type.syntaxBaseName)(\(raw: param.varName): $0) }")
132+
produceExpr = ExprSyntax("\(childName)Builder().map { \(raw: child.type.syntaxBaseName)(\(param.varOrCaseName): $0) }")
133133
} else {
134-
produceExpr = ExprSyntax("\(raw: child.type.syntaxBaseName)(\(raw: param.varName): \(raw: childName)Builder())")
134+
produceExpr = ExprSyntax("\(raw: child.type.syntaxBaseName)(\(param.varOrCaseName): \(childName)Builder())")
135135
}
136136
} else {
137-
produceExpr = ExprSyntax("\(raw: childName)Builder()")
137+
produceExpr = ExprSyntax("\(childName)Builder()")
138138
}
139139
builderParameters.append(
140140
FunctionParameterSyntax(
@@ -145,14 +145,20 @@ extension LayoutNode {
145145
produceExpr = convertFromSyntaxProtocolToSyntaxType(child: child, useDeprecatedChildName: useDeprecatedChildName)
146146
normalParameters.append(
147147
FunctionParameterSyntax(
148-
firstName: .identifier(childName),
148+
firstName: childName,
149149
colon: .colonToken(),
150150
type: child.parameterType,
151151
defaultArgument: child.defaultInitialization
152152
)
153153
)
154154
}
155-
delegatedInitArgs.append(TupleExprElementSyntax(label: child.isUnexpectedNodes ? nil : child.varName, expression: produceExpr))
155+
delegatedInitArgs.append(
156+
TupleExprElementSyntax(
157+
label: child.isUnexpectedNodes ? nil : child.varOrCaseName,
158+
colon: child.isUnexpectedNodes ? nil : .colonToken(),
159+
expression: produceExpr
160+
)
161+
)
156162
}
157163

158164
guard shouldCreateInitializer else {
@@ -185,11 +191,11 @@ extension LayoutNode {
185191
}
186192

187193
fileprivate func convertFromSyntaxProtocolToSyntaxType(child: Child, useDeprecatedChildName: Bool = false) -> ExprSyntax {
188-
let childName: String
194+
let childName: TokenSyntax
189195
if useDeprecatedChildName, let deprecatedVarName = child.deprecatedVarName {
190196
childName = deprecatedVarName
191197
} else {
192-
childName = child.varName
198+
childName = child.varOrCaseName
193199
}
194200

195201
if child.type.isBaseType && !child.kind.isNodeChoices {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ let childNameForDiagnosticFile = SourceFileSyntax(leadingTrivia: copyrightHeader
2525
for node in NON_BASE_SYNTAX_NODES.compactMap(\.layoutNode) {
2626
for child in node.children {
2727
if let nameForDiagnostics = child.nameForDiagnostics {
28-
SwitchCaseSyntax("case \\\(raw: node.type.syntaxBaseName).\(raw: child.varName):") {
28+
SwitchCaseSyntax("case \\\(raw: node.type.syntaxBaseName).\(child.varOrCaseName):") {
2929
StmtSyntax(#"return "\#(raw: nameForDiagnostics)""#)
3030
}
3131
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ let childNameForKeyPathFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
2929
for child in node.children {
3030
SwitchCaseSyntax(
3131
"""
32-
case \\\(raw: node.type.syntaxBaseName).\(raw: child.varName):
33-
return \(literal: child.varName)
32+
case \\\(raw: node.type.syntaxBaseName).\(child.varOrCaseName):
33+
return \(literal: child.varOrCaseName.description)
3434
"""
3535
)
3636
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ fileprivate extension Node {
2222
return node.children.compactMap { child -> (name: TokenSyntax, choices: [(caseName: TokenSyntax, kind: SyntaxNodeKind)])? in
2323
switch child.kind {
2424
case .nodeChoices(let choices):
25-
return (.identifier(child.name), choices.map { (.identifier($0.varName), $0.syntaxNodeKind) })
25+
return (.identifier(child.name), choices.map { ($0.varOrCaseName, $0.syntaxNodeKind) })
2626
default:
2727
return nil
2828
}
@@ -202,8 +202,8 @@ let rawSyntaxNodesFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
202202
let params = FunctionParameterListSyntax {
203203
for child in node.children {
204204
FunctionParameterSyntax(
205-
firstName: child.isUnexpectedNodes ? .wildcardToken(trailingTrivia: .space) : .identifier(child.varName),
206-
secondName: child.isUnexpectedNodes ? .identifier(child.varName) : nil,
205+
firstName: child.isUnexpectedNodes ? .wildcardToken(trailingTrivia: .space) : child.varOrCaseName,
206+
secondName: child.isUnexpectedNodes ? child.varOrCaseName : nil,
207207
colon: .colonToken(),
208208
type: child.rawParameterType,
209209
defaultArgument: child.isUnexpectedNodes ? child.defaultInitialization : nil
@@ -218,7 +218,7 @@ let rawSyntaxNodesFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
218218
ExprSyntax("layout.initialize(repeating: nil)")
219219
for (index, child) in node.children.enumerated() {
220220
let optionalMark = child.isOptional ? "?" : ""
221-
ExprSyntax("layout[\(raw: index)] = \(raw: child.varName.backtickedIfNeeded)\(raw: optionalMark).raw")
221+
ExprSyntax("layout[\(raw: index)] = \(child.varOrCaseName.backtickedIfNeeded)\(raw: optionalMark).raw")
222222
.with(\.leadingTrivia, .newline)
223223
}
224224
}
@@ -238,7 +238,7 @@ let rawSyntaxNodesFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
238238
}
239239

240240
for (index, child) in node.children.enumerated() {
241-
try VariableDeclSyntax("public var \(raw: child.varName.backtickedIfNeeded): Raw\(raw: child.type.buildable)") {
241+
try VariableDeclSyntax("public var \(child.varOrCaseName.backtickedIfNeeded): Raw\(raw: child.type.buildable)") {
242242
let iuoMark = child.isOptional ? "" : "!"
243243

244244
if child.syntaxNodeKind == .syntax {

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ let renamedChildrenCompatibilityFile = try! SourceFileSyntax(leadingTrivia: copy
2525

2626
DeclSyntax(
2727
"""
28-
@available(*, deprecated, renamed: "\(raw: child.varName)")
28+
@available(*, deprecated, renamed: "\(child.varOrCaseName)")
2929
public var \(raw: deprecatedVarName): \(raw: type) {
3030
get {
31-
return \(raw: child.varName.backtickedIfNeeded)
31+
return \(child.varOrCaseName.backtickedIfNeeded)
3232
}
3333
set {
34-
\(raw: child.varName.backtickedIfNeeded) = newValue
34+
\(child.varOrCaseName.backtickedIfNeeded) = newValue
3535
}
3636
}
3737
"""
@@ -57,7 +57,7 @@ let renamedChildrenCompatibilityFile = try! SourceFileSyntax(leadingTrivia: copy
5757

5858
let deprecatedNames = layoutNode.children
5959
.filter { !$0.isUnexpectedNodes && $0.deprecatedName != nil }
60-
.map { $0.varName }
60+
.map { $0.varOrCaseName.description }
6161
.joined(separator: ", ")
6262

6363
try! InitializerDeclSyntax(
@@ -71,9 +71,13 @@ let renamedChildrenCompatibilityFile = try! SourceFileSyntax(leadingTrivia: copy
7171
TupleExprElementSyntax(label: "leadingTrivia", expression: ExprSyntax("leadingTrivia"))
7272
for child in layoutNode.children {
7373
if child.isUnexpectedNodes {
74-
TupleExprElementSyntax(expression: ExprSyntax("\(raw: child.deprecatedVarName ?? child.varName)"))
74+
TupleExprElementSyntax(expression: ExprSyntax("\(raw: child.deprecatedVarName ?? child.varOrCaseName)"))
7575
} else {
76-
TupleExprElementSyntax(label: "\(child.varName)", expression: ExprSyntax("\(raw: child.deprecatedVarName ?? child.varName)"))
76+
TupleExprElementSyntax(
77+
label: child.varOrCaseName,
78+
colon: .colonToken(),
79+
expression: IdentifierExprSyntax(identifier: child.deprecatedVarName ?? child.varOrCaseName)
80+
)
7781
}
7882
}
7983
TupleExprElementSyntax(label: "trailingTrivia", expression: ExprSyntax("trailingTrivia"))

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func syntaxNode(emitKind: SyntaxNodeKind) -> SourceFileSyntax {
8989
) {
9090
let parameters = ClosureParameterListSyntax {
9191
for child in node.children {
92-
ClosureParameterSyntax(firstName: .identifier(child.varName.backtickedIfNeeded))
92+
ClosureParameterSyntax(firstName: child.varOrCaseName.backtickedIfNeeded)
9393
}
9494
}
9595

@@ -107,7 +107,7 @@ func syntaxNode(emitKind: SyntaxNodeKind) -> SourceFileSyntax {
107107
for child in node.children {
108108
ArrayElementSyntax(
109109
expression: MemberAccessExprSyntax(
110-
base: child.type.optionalChained(expr: ExprSyntax("\(raw: child.varName.backtickedIfNeeded)")),
110+
base: child.type.optionalChained(expr: ExprSyntax("\(child.varOrCaseName.backtickedIfNeeded)")),
111111
period: .periodToken(),
112112
name: "raw"
113113
)
@@ -169,7 +169,7 @@ func syntaxNode(emitKind: SyntaxNodeKind) -> SourceFileSyntax {
169169
try! VariableDeclSyntax(
170170
"""
171171
\(raw: child.docComment)
172-
public var \(raw: child.varName.backtickedIfNeeded): \(type)
172+
public var \(child.varOrCaseName.backtickedIfNeeded): \(type)
173173
"""
174174
) {
175175
AccessorDeclSyntax(accessorSpecifier: .keyword(.get)) {
@@ -202,12 +202,12 @@ func syntaxNode(emitKind: SyntaxNodeKind) -> SourceFileSyntax {
202202

203203
DeclSyntax(
204204
"""
205-
/// Adds the provided `element` to the node's `\(raw: child.varName)`
205+
/// Adds the provided `element` to the node's `\(child.varOrCaseName)`
206206
/// collection.
207207
/// - param element: The new `\(raw: childElt)` to add to the node's
208-
/// `\(raw: child.varName)` collection.
208+
/// `\(child.varOrCaseName)` collection.
209209
/// - returns: A copy of the receiver with the provided `\(raw: childElt)`
210-
/// appended to its `\(raw: child.varName)` collection.
210+
/// appended to its `\(child.varOrCaseName)` collection.
211211
public func add\(raw: childElt)(_ element: \(raw: childEltType)) -> \(node.kind.syntaxType) {
212212
var collection: RawSyntax
213213
let arena = SyntaxArena()
@@ -229,7 +229,7 @@ func syntaxNode(emitKind: SyntaxNodeKind) -> SourceFileSyntax {
229229
let layout = ArrayExprSyntax {
230230
for child in node.children {
231231
ArrayElementSyntax(
232-
expression: ExprSyntax(#"\Self.\#(raw: child.varName)"#)
232+
expression: ExprSyntax(#"\Self.\#(child.varOrCaseName)"#)
233233
)
234234
}
235235
}
@@ -248,13 +248,13 @@ private func generateSyntaxChildChoices(for child: Child) throws -> EnumDeclSynt
248248

249249
return try! EnumDeclSyntax("public enum \(raw: child.name): SyntaxChildChoices") {
250250
for choice in choices {
251-
DeclSyntax("case `\(raw: choice.varName)`(\(raw: choice.syntaxNodeKind.syntaxType))")
251+
DeclSyntax("case `\(choice.varOrCaseName)`(\(raw: choice.syntaxNodeKind.syntaxType))")
252252
}
253253

254254
try! VariableDeclSyntax("public var _syntaxNode: Syntax") {
255255
try! SwitchExprSyntax("switch self") {
256256
for choice in choices {
257-
SwitchCaseSyntax("case .\(raw: choice.varName)(let node):") {
257+
SwitchCaseSyntax("case .\(choice.varOrCaseName)(let node):") {
258258
StmtSyntax("return node._syntaxNode")
259259
}
260260
}
@@ -268,7 +268,7 @@ private func generateSyntaxChildChoices(for child: Child) throws -> EnumDeclSynt
268268
DeclSyntax(
269269
"""
270270
public init(_ node: some \(choiceNode.kind.protocolType)) {
271-
self = .\(raw: choice.varName)(\(choiceNode.kind.syntaxType)(node))
271+
self = .\(choice.varOrCaseName)(\(choiceNode.kind.syntaxType)(node))
272272
}
273273
"""
274274
)
@@ -277,7 +277,7 @@ private func generateSyntaxChildChoices(for child: Child) throws -> EnumDeclSynt
277277
DeclSyntax(
278278
"""
279279
public init(_ node: \(choice.syntaxNodeKind.syntaxType)) {
280-
self = .\(raw: choice.varName)(node)
280+
self = .\(choice.varOrCaseName)(node)
281281
}
282282
"""
283283
)
@@ -289,7 +289,7 @@ private func generateSyntaxChildChoices(for child: Child) throws -> EnumDeclSynt
289289
StmtSyntax(
290290
"""
291291
if let node = node.as(\(choice.syntaxNodeKind.syntaxType).self) {
292-
self = .\(raw: choice.varName)(node)
292+
self = .\(choice.varOrCaseName)(node)
293293
return
294294
}
295295
"""

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ let syntaxTraitsFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
2929
DeclSyntax(
3030
"""
3131
\(raw: child.docComment)
32-
var \(raw: child.varName): \(child.syntaxNodeKind.syntaxType)\(raw: child.isOptional ? "?" : "") { get set }
32+
var \(child.varOrCaseName): \(child.syntaxNodeKind.syntaxType)\(raw: child.isOptional ? "?" : "") { get set }
3333
"""
3434
)
3535
}

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntaxbuilder/RenamedChildrenBuilderCompatibilityFile.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ let renamedChildrenBuilderCompatibilityFile = try! SourceFileSyntax(leadingTrivi
2222
if let convenienceInit = try layoutNode.createConvenienceBuilderInitializer(useDeprecatedChildName: true) {
2323
let deprecatedNames = layoutNode.children
2424
.filter { !$0.isUnexpectedNodes && $0.deprecatedName != nil }
25-
.compactMap { $0.varName }
25+
.compactMap { $0.varOrCaseName.description }
2626
.joined(separator: ", ")
2727

2828
DeclSyntax(

0 commit comments

Comments
 (0)