Skip to content

Commit 26183b9

Browse files
authored
Merge pull request #70198 from rintaro/astgen-genericnullable
[ASTGen] Generalize BridgedNullable
2 parents 1b0d9d8 + d592ae4 commit 26183b9

File tree

2 files changed

+38
-68
lines changed

2 files changed

+38
-68
lines changed

lib/ASTGen/Sources/ASTGen/ASTGen.swift

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -214,55 +214,37 @@ extension ASTGenVisitor {
214214
extension ASTGenVisitor {
215215
@inline(__always)
216216
func generate(type node: TypeSyntax?) -> BridgedNullableTypeRepr {
217-
self.map(node, generate(type:))
217+
node.map(generate(type:)).asNullable
218218
}
219219

220220
@inline(__always)
221221
func generate(expr node: ExprSyntax?) -> BridgedNullableExpr {
222-
self.map(node, generate(expr:))
222+
node.map(generate(expr:)).asNullable
223223
}
224224

225225
@inline(__always)
226226
func generate(genericParameterClause node: GenericParameterClauseSyntax?) -> BridgedNullableGenericParamList {
227-
self.map(node, generate(genericParameterClause:))
227+
node.map(generate(genericParameterClause:)).asNullable
228228
}
229229

230230
@inline(__always)
231231
func generate(genericWhereClause node: GenericWhereClauseSyntax?) -> BridgedNullableTrailingWhereClause {
232-
self.map(node, generate(genericWhereClause:))
232+
node.map(generate(genericWhereClause:)).asNullable
233233
}
234234

235235
@inline(__always)
236236
func generate(enumCaseParameterClause node: EnumCaseParameterClauseSyntax?) -> BridgedNullableParameterList {
237-
self.map(node, generate(enumCaseParameterClause:))
237+
node.map(generate(enumCaseParameterClause:)).asNullable
238238
}
239239

240240
@inline(__always)
241241
func generate(inheritedTypeList node: InheritedTypeListSyntax?) -> BridgedArrayRef {
242-
self.map(node, generate(inheritedTypeList:))
242+
node.map(generate(inheritedTypeList:)) ?? .init()
243243
}
244244

245245
@inline(__always)
246246
func generate(precedenceGroupNameList node: PrecedenceGroupNameListSyntax?) -> BridgedArrayRef {
247-
self.map(node, generate(precedenceGroupNameList:))
248-
}
249-
250-
// Helper function for `generate(foo: FooSyntax?)` methods.
251-
@inline(__always)
252-
private func map<Node: SyntaxProtocol, Result: HasNullable>(
253-
_ node: Node?,
254-
_ body: (Node) -> Result
255-
) -> Result.Nullable {
256-
return Result.asNullable(node.map(body))
257-
}
258-
259-
// Helper function for `generate(barList: BarListSyntax?)` methods for collection nodes.
260-
@inline(__always)
261-
private func map<Node: SyntaxCollection>(
262-
_ node: Node?,
263-
_ body: (Node) -> BridgedArrayRef
264-
) -> BridgedArrayRef {
265-
return node.map(body) ?? .init()
247+
node.map(generate(precedenceGroupNameList:)) ?? .init()
266248
}
267249
}
268250

lib/ASTGen/Sources/ASTGen/Bridge.swift

Lines changed: 31 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,69 +14,57 @@ import ASTBridging
1414
import BasicBridging
1515
import SwiftSyntax
1616

17-
extension BridgedSourceLoc: ExpressibleByNilLiteral {
18-
public init(nilLiteral: ()) {
19-
self.init(raw: nil)
20-
}
17+
protocol BridgedNullable: ExpressibleByNilLiteral {
18+
associatedtype RawPtr
19+
init(raw: RawPtr?)
2120
}
22-
23-
extension BridgedIdentifier: ExpressibleByNilLiteral {
21+
extension BridgedNullable {
2422
public init(nilLiteral: ()) {
2523
self.init(raw: nil)
2624
}
2725
}
2826

27+
extension BridgedSourceLoc: BridgedNullable {}
28+
extension BridgedIdentifier: BridgedNullable {}
29+
extension BridgedNullableExpr: BridgedNullable {}
30+
extension BridgedNullableStmt: BridgedNullable {}
31+
extension BridgedNullableTypeRepr: BridgedNullable {}
32+
extension BridgedNullablePattern: BridgedNullable {}
33+
extension BridgedNullableGenericParamList: BridgedNullable {}
34+
extension BridgedNullableTrailingWhereClause: BridgedNullable {}
35+
extension BridgedNullableParameterList: BridgedNullable {}
36+
2937
/// Protocol that declares that there's a "Nullable" variation of the type.
3038
///
3139
/// E.g. BridgedExpr vs BridgedNullableExpr.
32-
protocol HasNullable {
33-
associatedtype Nullable
34-
35-
/// Convert an `Optional<Self>` to `Nullable`.
36-
static func asNullable(_ node: Self?) -> Nullable
40+
protocol BridgedHasNullable {
41+
associatedtype Nullable: BridgedNullable
42+
var raw: Nullable.RawPtr { get }
3743
}
38-
39-
extension Optional where Wrapped: HasNullable {
44+
extension Optional where Wrapped: BridgedHasNullable {
4045
/// Convert an Optional to Nullable variation of the wrapped type.
4146
var asNullable: Wrapped.Nullable {
42-
Wrapped.asNullable(self)
47+
Wrapped.Nullable(raw: self?.raw)
4348
}
4449
}
4550

46-
extension BridgedStmt: HasNullable {
47-
static func asNullable(_ node: Self?) -> BridgedNullableStmt {
48-
.init(raw: node?.raw)
49-
}
51+
extension BridgedStmt: BridgedHasNullable {
52+
typealias Nullable = BridgedNullableStmt
5053
}
51-
52-
extension BridgedExpr: HasNullable {
53-
static func asNullable(_ node: Self?) -> BridgedNullableExpr {
54-
.init(raw: node?.raw)
55-
}
54+
extension BridgedExpr: BridgedHasNullable {
55+
typealias Nullable = BridgedNullableExpr
5656
}
57-
58-
extension BridgedTypeRepr: HasNullable {
59-
static func asNullable(_ node: Self?) -> BridgedNullableTypeRepr {
60-
.init(raw: node?.raw)
61-
}
57+
extension BridgedTypeRepr: BridgedHasNullable {
58+
typealias Nullable = BridgedNullableTypeRepr
6259
}
63-
64-
extension BridgedGenericParamList: HasNullable {
65-
static func asNullable(_ node: Self?) -> BridgedNullableGenericParamList {
66-
.init(raw: node?.raw)
67-
}
60+
extension BridgedGenericParamList: BridgedHasNullable {
61+
typealias Nullable = BridgedNullableGenericParamList
6862
}
69-
70-
extension BridgedTrailingWhereClause: HasNullable {
71-
static func asNullable(_ node: Self?) -> BridgedNullableTrailingWhereClause {
72-
.init(raw: node?.raw)
73-
}
63+
extension BridgedTrailingWhereClause: BridgedHasNullable {
64+
typealias Nullable = BridgedNullableTrailingWhereClause
7465
}
75-
76-
extension BridgedParameterList: HasNullable {
77-
static func asNullable(_ node: Self?) -> BridgedNullableParameterList {
78-
.init(raw: node?.raw)
79-
}
66+
extension BridgedParameterList: BridgedHasNullable {
67+
typealias Nullable = BridgedNullableParameterList
8068
}
8169

8270
public extension BridgedSourceLoc {

0 commit comments

Comments
 (0)