Skip to content

Commit c14327d

Browse files
committed
[NFC] [ASTGen] Beef up Nullable/Optional bridging
Adds a failable `init(_:)` to `BridgedHasNullable` types which can convert the Nullable variant into an Optional of the non-Nullable variant. Also added a member to `BridgedSourceLoc` to support a new requirement for this feature.
1 parent e11d150 commit c14327d

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

include/swift/Basic/BasicBridging.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,11 @@ class BridgedSourceLoc {
322322
SWIFT_NAME("getter:BridgedSourceLoc.isValid(self:)")
323323
BRIDGED_INLINE bool BridgedSourceLoc_isValid(BridgedSourceLoc loc);
324324

325+
SWIFT_NAME("getter:BridgedSourceLoc.raw(self:)")
326+
inline const void * _Nullable BridgedSourceLoc_getRaw(BridgedSourceLoc bridged) {
327+
return bridged.getOpaquePointerValue();
328+
}
329+
325330
//===----------------------------------------------------------------------===//
326331
// MARK: SourceRange
327332
//===----------------------------------------------------------------------===//

lib/ASTGen/Sources/ASTGen/Bridge.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import BasicBridging
1717
public protocol BridgedNullable: ExpressibleByNilLiteral {
1818
associatedtype RawPtr
1919
init(raw: RawPtr?)
20+
var raw: RawPtr? { get }
2021
}
2122
extension BridgedNullable {
2223
public init(nilLiteral: ()) {
@@ -35,6 +36,8 @@ extension BridgedNullableTrailingWhereClause: /*@retroactive*/ swiftASTGen.Bridg
3536
extension BridgedNullableParameterList: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3637
extension BridgedNullablePatternBindingInitializer: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3738
extension BridgedNullableArgumentList: /*@retroactive*/ swiftASTGen.BridgedNullable {}
39+
extension BridgedNullablePatternBindingDecl: /*@retroactive*/ swiftASTGen.BridgedNullable {}
40+
extension BridgedNullableVarDecl: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3841

3942
extension BridgedIdentifier: /*@retroactive*/ Swift.Equatable {
4043
public static func == (lhs: Self, rhs: Self) -> Bool {
@@ -47,6 +50,7 @@ extension BridgedIdentifier: /*@retroactive*/ Swift.Equatable {
4750
/// E.g. BridgedExpr vs BridgedNullableExpr.
4851
protocol BridgedHasNullable {
4952
associatedtype Nullable: BridgedNullable
53+
init(raw: Nullable.RawPtr)
5054
var raw: Nullable.RawPtr { get }
5155
}
5256
extension Optional where Wrapped: BridgedHasNullable {
@@ -55,6 +59,14 @@ extension Optional where Wrapped: BridgedHasNullable {
5559
Wrapped.Nullable(raw: self?.raw)
5660
}
5761
}
62+
extension BridgedHasNullable {
63+
init?(_ nullable: Nullable) {
64+
guard let newRaw = nullable.raw else {
65+
return nil
66+
}
67+
self.init(raw: newRaw)
68+
}
69+
}
5870

5971
extension BridgedStmt: BridgedHasNullable {
6072
typealias Nullable = BridgedNullableStmt
@@ -83,6 +95,12 @@ extension BridgedPatternBindingInitializer: BridgedHasNullable {
8395
extension BridgedArgumentList: BridgedHasNullable {
8496
typealias Nullable = BridgedNullableArgumentList
8597
}
98+
extension BridgedPatternBindingDecl: BridgedHasNullable {
99+
typealias Nullable = BridgedNullablePatternBindingDecl
100+
}
101+
extension BridgedVarDecl: BridgedHasNullable {
102+
typealias Nullable = BridgedNullableVarDecl
103+
}
86104

87105
public extension BridgedSourceLoc {
88106
/// Form a source location at the given absolute position in `buffer`.

lib/ASTGen/Sources/ASTGen/Decls.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ extension ASTGenVisitor {
481481
if let accessors = binding.accessorBlock {
482482
// FIXME: We ought to have a better way of converting from the Nullable
483483
// wrapper back to Optional.
484-
if let primaryVar = pattern.singleVar.raw.map(BridgedVarDecl.init) {
484+
if let primaryVar = BridgedVarDecl(pattern.singleVar) {
485485
let storage = primaryVar.asAbstractStorageDecl
486486
storage.setAccessors(generate(accessorBlock: accessors, for: storage))
487487
} else {

0 commit comments

Comments
 (0)