Skip to content

Commit ec9a775

Browse files
committed
improve ergonomics for initializers of raw syntax nodes
added convenience initializers for choice enum changed parameter types in RawNode's initializers from concrete types to generic whenever possible
1 parent f8b6353 commit ec9a775

24 files changed

+232
-216
lines changed

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,11 @@ let layoutNodesParsableFile = SourceFileSyntax(leadingTrivia: copyrightHeader) {
6565
// The missing item is not necessary to be a declaration,
6666
// which is just a placeholder here
6767
return RawCodeBlockItemSyntax(
68-
item: .decl(
69-
RawDeclSyntax(
70-
RawMissingDeclSyntax(
71-
attributes: self.emptyCollection(RawAttributeListSyntax.self),
72-
modifiers: self.emptyCollection(RawDeclModifierListSyntax.self),
73-
arena: self.arena
74-
)
68+
item: .init(
69+
decl: RawMissingDeclSyntax(
70+
attributes: self.emptyCollection(RawAttributeListSyntax.self),
71+
modifiers: self.emptyCollection(RawDeclModifierListSyntax.self),
72+
arena: self.arena
7573
)
7674
),
7775
semicolon: nil,

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

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,18 @@ func rawSyntaxNodesFile(nodesStartingWith: [Character]) -> SourceFileSyntax {
102102

103103
StmtSyntax("return nil")
104104
}
105+
106+
for (swiftName, kind) in choices {
107+
if let choiceNode = SYNTAX_NODE_MAP[kind], choiceNode.kind.isBase {
108+
DeclSyntax(
109+
"""
110+
public init(\(swiftName): some \(choiceNode.kind.rawProtocolType)) {
111+
self = .\(swiftName)(\(choiceNode.kind.rawType)(\(swiftName)))
112+
}
113+
"""
114+
)
115+
}
116+
}
105117
}
106118
}
107119

@@ -270,9 +282,16 @@ func rawSyntaxNodesFile(nodesStartingWith: [Character]) -> SourceFileSyntax {
270282

271283
fileprivate extension Child {
272284
var rawParameterType: TypeSyntax {
273-
let paramType: TypeSyntax
274-
if case ChildKind.nodeChoices = kind {
275-
paramType = syntaxChoicesType
285+
var paramType: TypeSyntax
286+
if !kind.isNodeChoicesEmpty {
287+
paramType = "\(syntaxChoicesType)"
288+
} else if hasBaseType && !isOptional {
289+
// we restrict the use of generic type to non-optional parameter types, otherwise call sites would no longer be
290+
// able to just pass `nil` to this parameter without specializing `(some Raw<Kind>SyntaxNodeProtocol)?`
291+
//
292+
// we've opted out of providing a default value to the parameter (e.g. `RawExprSyntax?.none`) as a workaround,
293+
// as passing an explicit `nil` would prompt developers to think clearly whether this parameter should be parsed
294+
paramType = "some \(syntaxNodeKind.rawProtocolType)"
276295
} else {
277296
paramType = syntaxNodeKind.rawType
278297
}

Sources/SwiftParser/Attributes.swift

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -361,9 +361,7 @@ extension Parser {
361361
unexpectedBeforeAtSign,
362362
atSign: atSign,
363363
unexpectedBeforeAttributeName,
364-
attributeName: RawTypeSyntax(
365-
RawIdentifierTypeSyntax(name: attributeName, genericArgumentClause: nil, arena: self.arena)
366-
),
364+
attributeName: RawIdentifierTypeSyntax(name: attributeName, genericArgumentClause: nil, arena: self.arena),
367365
leftParen: nil,
368366
arguments: nil,
369367
rightParen: nil,
@@ -394,13 +392,11 @@ extension RawLabeledExprSyntax {
394392
self.init(
395393
label: nil,
396394
colon: nil,
397-
expression: RawExprSyntax(
398-
RawDeclReferenceExprSyntax(
399-
unexpectedBeforeIdentifier,
400-
baseName: identifier,
401-
argumentNames: nil,
402-
arena: arena
403-
)
395+
expression: RawDeclReferenceExprSyntax(
396+
unexpectedBeforeIdentifier,
397+
baseName: identifier,
398+
argumentNames: nil,
399+
arena: arena
404400
),
405401
unexpectedBetweenIdentifierAndTrailingComma,
406402
trailingComma: trailingComma,
@@ -448,9 +444,7 @@ extension Parser {
448444
unexpectedBeforeAtSign,
449445
atSign: atSign,
450446
unexpectedBeforeDifferentiable,
451-
attributeName: RawTypeSyntax(
452-
RawIdentifierTypeSyntax(name: differentiable, genericArgumentClause: nil, arena: self.arena)
453-
),
447+
attributeName: RawIdentifierTypeSyntax(name: differentiable, genericArgumentClause: nil, arena: self.arena),
454448
unexpectedBeforeLeftParen,
455449
leftParen: leftParen,
456450
arguments: .differentiableArguments(argument),
@@ -592,9 +586,7 @@ extension Parser {
592586
unexpectedBeforeAtSign,
593587
atSign: atSign,
594588
unexpectedBeforeDerivative,
595-
attributeName: RawTypeSyntax(
596-
RawIdentifierTypeSyntax(name: derivative, genericArgumentClause: nil, arena: self.arena)
597-
),
589+
attributeName: RawIdentifierTypeSyntax(name: derivative, genericArgumentClause: nil, arena: self.arena),
598590
unexpectedBeforeLeftParen,
599591
leftParen: leftParen,
600592
arguments: .derivativeRegistrationArguments(argument),
@@ -616,9 +608,7 @@ extension Parser {
616608
unexpectedBeforeAtSign,
617609
atSign: atSign,
618610
unexpectedBeforeTranspose,
619-
attributeName: RawTypeSyntax(
620-
RawIdentifierTypeSyntax(name: transpose, genericArgumentClause: nil, arena: self.arena)
621-
),
611+
attributeName: RawIdentifierTypeSyntax(name: transpose, genericArgumentClause: nil, arena: self.arena),
622612
unexpectedBeforeLeftParen,
623613
leftParen: leftParen,
624614
arguments: .derivativeRegistrationArguments(argument),

Sources/SwiftParser/CollectionNodes+Parsable.swift

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@ extension AccessorDeclListSyntax: SyntaxParseable {
8181
extension AttributeListSyntax: SyntaxParseable {
8282
public static func parse(from parser: inout Parser) -> Self {
8383
return parse(from: &parser) { parser in
84-
return RawSyntax(parser.parseAttributeList())
84+
return parser.parseAttributeList()
8585
} makeMissing: { remainingTokens, arena in
8686
return RawAttributeSyntax(
8787
atSign: RawTokenSyntax(missing: .atSign, arena: arena),
88-
attributeName: RawTypeSyntax(RawMissingTypeSyntax(arena: arena)),
88+
attributeName: RawMissingTypeSyntax(arena: arena),
8989
leftParen: nil,
9090
arguments: nil,
9191
rightParen: nil,
@@ -99,18 +99,21 @@ extension CodeBlockItemListSyntax: SyntaxParseable {
9999
public static func parse(from parser: inout Parser) -> Self {
100100
return parse(from: &parser) { parser in
101101
let node = parser.parseCodeBlockItemList(until: { _ in false })
102-
return RawSyntax(node)
102+
return node
103103
} makeMissing: { remainingTokens, arena in
104-
let missingExpr = RawMissingExprSyntax(arena: arena)
105-
return RawCodeBlockItemSyntax(item: .expr(RawExprSyntax(missingExpr)), semicolon: nil, arena: arena)
104+
RawCodeBlockItemSyntax(
105+
item: .init(expr: RawMissingExprSyntax(arena: arena)),
106+
semicolon: nil,
107+
arena: arena
108+
)
106109
}
107110
}
108111
}
109112

110113
extension MemberBlockItemListSyntax: SyntaxParseable {
111114
public static func parse(from parser: inout Parser) -> Self {
112115
return parse(from: &parser) { parser in
113-
return RawSyntax(parser.parseMemberDeclList())
116+
return parser.parseMemberDeclList()
114117
} makeMissing: { remainingTokens, arena in
115118
let missingDecl = RawMissingDeclSyntax(
116119
attributes: RawAttributeListSyntax(elements: [], arena: arena),
@@ -119,7 +122,7 @@ extension MemberBlockItemListSyntax: SyntaxParseable {
119122
RawUnexpectedNodesSyntax(remainingTokens, arena: arena),
120123
arena: arena
121124
)
122-
return RawMemberBlockItemSyntax(decl: RawDeclSyntax(missingDecl), semicolon: nil, arena: arena)
125+
return RawMemberBlockItemSyntax(decl: missingDecl, semicolon: nil, arena: arena)
123126
}
124127
}
125128
}

Sources/SwiftParser/Declarations.swift

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -534,9 +534,9 @@ extension Parser {
534534
RawGenericRequirementSyntax(
535535
requirement: .sameTypeRequirement(
536536
RawSameTypeRequirementSyntax(
537-
leftType: RawTypeSyntax(RawMissingTypeSyntax(arena: self.arena)),
537+
leftType: RawMissingTypeSyntax(arena: self.arena),
538538
equal: missingToken(.binaryOperator, text: "=="),
539-
rightType: RawTypeSyntax(RawMissingTypeSyntax(arena: self.arena)),
539+
rightType: RawMissingTypeSyntax(arena: self.arena),
540540
arena: self.arena
541541
)
542542
),
@@ -674,7 +674,7 @@ extension Parser {
674674
RawSameTypeRequirementSyntax(
675675
leftType: firstType,
676676
equal: RawTokenSyntax(missing: .binaryOperator, text: "==", arena: self.arena),
677-
rightType: RawTypeSyntax(RawMissingTypeSyntax(arena: self.arena)),
677+
rightType: RawMissingTypeSyntax(arena: self.arena),
678678
arena: self.arena
679679
)
680680
)
@@ -722,12 +722,10 @@ extension Parser {
722722
if let remainingTokens = remainingTokensIfMaximumNestingLevelReached() {
723723
let item = RawMemberBlockItemSyntax(
724724
remainingTokens,
725-
decl: RawDeclSyntax(
726-
RawMissingDeclSyntax(
727-
attributes: self.emptyCollection(RawAttributeListSyntax.self),
728-
modifiers: self.emptyCollection(RawDeclModifierListSyntax.self),
729-
arena: self.arena
730-
)
725+
decl: RawMissingDeclSyntax(
726+
attributes: self.emptyCollection(RawAttributeListSyntax.self),
727+
modifiers: self.emptyCollection(RawDeclModifierListSyntax.self),
728+
arena: self.arena
731729
),
732730
semicolon: nil,
733731
arena: self.arena
@@ -1558,7 +1556,7 @@ extension Parser {
15581556
let unexpectedBeforeEqual: RawUnexpectedNodesSyntax?
15591557
let equal: RawTokenSyntax
15601558
if let colon = self.consume(if: .colon) {
1561-
unexpectedBeforeEqual = RawUnexpectedNodesSyntax(elements: [RawSyntax(colon)], arena: self.arena)
1559+
unexpectedBeforeEqual = RawUnexpectedNodesSyntax([colon], arena: self.arena)
15621560
equal = missingToken(.equal)
15631561
} else {
15641562
(unexpectedBeforeEqual, equal) = self.expect(.equal)

Sources/SwiftParser/Directives.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ extension Parser {
7575

7676
// Parse #if
7777
let (unexpectedBeforePoundIf, poundIf) = self.expect(.poundIf)
78-
let condition = RawExprSyntax(self.parseSequenceExpression(flavor: .poundIfDirective))
78+
let condition = self.parseSequenceExpression(flavor: .poundIfDirective)
7979
let unexpectedBetweenConditionAndElements = self.consumeRemainingTokenOnLine()
8080

8181
clauses.append(
@@ -102,7 +102,7 @@ extension Parser {
102102
switch match {
103103
case .poundElseif:
104104
(unexpectedBeforePound, pound) = self.eat(handle)
105-
condition = RawExprSyntax(self.parseSequenceExpression(flavor: .poundIfDirective))
105+
condition = self.parseSequenceExpression(flavor: .poundIfDirective)
106106
unexpectedBetweenConditionAndElements = self.consumeRemainingTokenOnLine()
107107
case .poundElse:
108108
(unexpectedBeforePound, pound) = self.eat(handle)
@@ -114,7 +114,7 @@ extension Parser {
114114
arena: self.arena
115115
)
116116
pound = self.missingToken(.poundElseif)
117-
condition = RawExprSyntax(self.parseSequenceExpression(flavor: .poundIfDirective))
117+
condition = self.parseSequenceExpression(flavor: .poundIfDirective)
118118
} else {
119119
condition = nil
120120
}
@@ -132,7 +132,7 @@ extension Parser {
132132
arena: self.arena
133133
)
134134
pound = self.missingToken(.poundElseif)
135-
condition = RawExprSyntax(self.parseSequenceExpression(flavor: .poundIfDirective))
135+
condition = self.parseSequenceExpression(flavor: .poundIfDirective)
136136
unexpectedBetweenConditionAndElements = self.consumeRemainingTokenOnLine()
137137
} else {
138138
break LOOP

0 commit comments

Comments
 (0)