Skip to content

Commit e0971a7

Browse files
authored
Merge pull request #2805 from AppAppWorks/improve-ergonomics-raw-syntax-initializers
2 parents a56cde8 + ec9a775 commit e0971a7

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)