Skip to content

Commit 04a66e8

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 ea8db99 commit 04a66e8

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: ()) {
@@ -34,6 +35,8 @@ extension BridgedNullableGenericParamList: /*@retroactive*/ swiftASTGen.BridgedN
3435
extension BridgedNullableTrailingWhereClause: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3536
extension BridgedNullableParameterList: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3637
extension BridgedNullablePatternBindingInitializer: /*@retroactive*/ swiftASTGen.BridgedNullable {}
38+
extension BridgedNullablePatternBindingDecl: /*@retroactive*/ swiftASTGen.BridgedNullable {}
39+
extension BridgedNullableVarDecl: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3740

3841
extension BridgedIdentifier: /*@retroactive*/ Swift.Equatable {
3942
public static func == (lhs: Self, rhs: Self) -> Bool {
@@ -46,6 +49,7 @@ extension BridgedIdentifier: /*@retroactive*/ Swift.Equatable {
4649
/// E.g. BridgedExpr vs BridgedNullableExpr.
4750
protocol BridgedHasNullable {
4851
associatedtype Nullable: BridgedNullable
52+
init(raw: Nullable.RawPtr)
4953
var raw: Nullable.RawPtr { get }
5054
}
5155
extension Optional where Wrapped: BridgedHasNullable {
@@ -54,6 +58,14 @@ extension Optional where Wrapped: BridgedHasNullable {
5458
Wrapped.Nullable(raw: self?.raw)
5559
}
5660
}
61+
extension BridgedHasNullable {
62+
init?(_ nullable: Nullable) {
63+
guard let newRaw = nullable.raw else {
64+
return nil
65+
}
66+
self.init(raw: newRaw)
67+
}
68+
}
5769

5870
extension BridgedStmt: BridgedHasNullable {
5971
typealias Nullable = BridgedNullableStmt
@@ -79,6 +91,12 @@ extension BridgedParameterList: BridgedHasNullable {
7991
extension BridgedPatternBindingInitializer: BridgedHasNullable {
8092
typealias Nullable = BridgedNullablePatternBindingInitializer
8193
}
94+
extension BridgedPatternBindingDecl: BridgedHasNullable {
95+
typealias Nullable = BridgedNullablePatternBindingDecl
96+
}
97+
extension BridgedVarDecl: BridgedHasNullable {
98+
typealias Nullable = BridgedNullableVarDecl
99+
}
82100

83101
public extension BridgedSourceLoc {
84102
/// 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
@@ -444,7 +444,7 @@ extension ASTGenVisitor {
444444
if let accessors = binding.accessorBlock {
445445
// FIXME: We ought to have a better way of converting from the Nullable
446446
// wrapper back to Optional.
447-
if let primaryVar = pattern.singleVar.raw.map(BridgedVarDecl.init) {
447+
if let primaryVar = BridgedVarDecl(pattern.singleVar) {
448448
let storage = primaryVar.asAbstractStorageDecl
449449
storage.setAccessors(generate(accessorBlock: accessors, for: storage))
450450
} else {

0 commit comments

Comments
 (0)