Skip to content

Commit 0ced6e0

Browse files
committed
[ASTGen] Generate CaptureListExpr
Move the capture list entry construction logic to CaptureListEntry::createParsed() so that ASTGen can use it.
1 parent 5eca0fd commit 0ced6e0

File tree

12 files changed

+225
-48
lines changed

12 files changed

+225
-48
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class AvailabilityDomain;
3737
class Argument;
3838
class ASTContext;
3939
struct ASTNode;
40+
struct CaptureListEntry;
4041
class DeclAttributes;
4142
class DeclBaseName;
4243
class DeclNameLoc;
@@ -55,6 +56,7 @@ enum class PlatformKind : uint8_t;
5556
class ProtocolConformanceRef;
5657
class RegexLiteralPatternFeature;
5758
class RegexLiteralPatternFeatureKind;
59+
enum class ReferenceOwnership : uint8_t;
5860
class Type;
5961
class CanType;
6062
class TypeBase;
@@ -114,6 +116,10 @@ inline const void *_Nullable BridgedIdentifier_raw(BridgedIdentifier ident) {
114116
return ident.Raw;
115117
}
116118

119+
SWIFT_NAME("getter:BridgedIdentifier.str(self:)")
120+
BRIDGED_INLINE BridgedStringRef
121+
BridgedIdentifier_getStr(BridgedIdentifier ident);
122+
117123
SWIFT_NAME("getter:BridgedIdentifier.isOperator(self:)")
118124
BRIDGED_INLINE bool BridgedIdentifier_isOperator(const BridgedIdentifier);
119125

@@ -1104,11 +1110,14 @@ BridgedRawDocCommentAttr_createParsed(BridgedASTContext cContext,
11041110
BridgedCharSourceRange cRange);
11051111

11061112
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedReferenceOwnership {
1113+
BridgedReferenceOwnershipStrong,
11071114
BridgedReferenceOwnershipWeak,
11081115
BridgedReferenceOwnershipUnowned,
11091116
BridgedReferenceOwnershipUnmanaged,
11101117
};
11111118

1119+
swift::ReferenceOwnership unbridged(BridgedReferenceOwnership kind);
1120+
11121121
SWIFT_NAME("BridgedReferenceOwnershipAttr.createParsed(_:atLoc:range:kind:)")
11131122
BridgedReferenceOwnershipAttr BridgedReferenceOwnershipAttr_createParsed(
11141123
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
@@ -1625,6 +1634,33 @@ BridgedCallExpr BridgedCallExpr_createParsed(BridgedASTContext cContext,
16251634
BridgedExpr fn,
16261635
BridgedArgumentList args);
16271636

1637+
class BridgedCaptureListEntry {
1638+
swift::PatternBindingDecl *_Nonnull PBD;
1639+
1640+
public:
1641+
BRIDGED_INLINE BridgedCaptureListEntry(swift::CaptureListEntry CLE);
1642+
1643+
BRIDGED_INLINE swift::CaptureListEntry unbridged() const;
1644+
};
1645+
1646+
SWIFT_NAME("BridgedCaptureListEntry.createParsed(_:declContext:ownership:"
1647+
"ownershipRange:name:nameLoc:equalLoc:initializer:)")
1648+
BridgedCaptureListEntry BridegedCaptureListEntry_createParsed(
1649+
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
1650+
BridgedReferenceOwnership cOwnershipKind,
1651+
BridgedSourceRange cOwnershipRange, BridgedIdentifier cName,
1652+
BridgedSourceLoc cNameLoc, BridgedSourceLoc cEqualLoc,
1653+
BridgedExpr cInitializer);
1654+
1655+
SWIFT_NAME("getter:BridgedCaptureListEntry.varDecl(self:)")
1656+
BRIDGED_INLINE BridgedVarDecl
1657+
BridegedCaptureListEntry_getVar(BridgedCaptureListEntry entry);
1658+
1659+
SWIFT_NAME("BridgedCaptureListExpr.createParsed(_:captureList:closure:)")
1660+
BridgedCaptureListExpr BridgedCaptureListExpr_createParsed(BridgedASTContext cContext,
1661+
BridgedArrayRef cCaptureList,
1662+
BridgedClosureExpr cClosure);
1663+
16281664
SWIFT_NAME("BridgedClosureExpr.createParsed(_:declContext:attributes:"
16291665
"bracketRange:capturedSelfDecl:parameterList:asyncLoc:throwsLoc:"
16301666
"thrownType:arrowLoc:explicitResultType:inLoc:)")

include/swift/AST/ASTBridgingImpl.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@ swift::Identifier BridgedIdentifier::unbridged() const {
4040
return swift::Identifier::getFromOpaquePointer(Raw);
4141
}
4242

43-
SWIFT_NAME("getter:BridgedIdentifier.isOperator(self:)")
43+
BridgedStringRef BridgedIdentifier_getStr(const BridgedIdentifier ident) {
44+
return ident.unbridged().str();
45+
}
46+
4447
bool BridgedIdentifier_isOperator(const BridgedIdentifier ident) {
4548
return ident.unbridged().isOperator();
4649
}
@@ -629,6 +632,20 @@ swift::StmtConditionElement BridgedStmtConditionElement::unbridged() const {
629632
return swift::StmtConditionElement::fromOpaqueValue(Raw);
630633
}
631634

635+
//===----------------------------------------------------------------------===//
636+
// MARK: BridgedCaptureListEntry
637+
//===----------------------------------------------------------------------===//
638+
639+
BridgedCaptureListEntry::BridgedCaptureListEntry(swift::CaptureListEntry CLE)
640+
: PBD(CLE.PBD) {}
641+
642+
swift::CaptureListEntry BridgedCaptureListEntry::unbridged() const {
643+
return swift::CaptureListEntry(PBD);
644+
}
645+
646+
BridgedVarDecl BridegedCaptureListEntry_getVar(BridgedCaptureListEntry entry) {
647+
return entry.unbridged().getVar();
648+
}
632649

633650
SWIFT_END_NULLABILITY_ANNOTATIONS
634651

include/swift/AST/Expr.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4562,6 +4562,11 @@ struct CaptureListEntry {
45624562

45634563
explicit CaptureListEntry(PatternBindingDecl *PBD);
45644564

4565+
static CaptureListEntry
4566+
createParsed(ASTContext &Ctx, ReferenceOwnership ownershipKind,
4567+
SourceRange ownershipRange, Identifier name, SourceLoc nameLoc,
4568+
SourceLoc equalLoc, Expr *initializer, DeclContext *DC);
4569+
45654570
VarDecl *getVar() const;
45664571
bool isSimpleSelfCapture(bool excludeWeakCaptures = true) const;
45674572
};

include/swift/Basic/BasicBridging.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,10 @@ BRIDGED_INLINE SwiftInt BridgedStringRef_count(BridgedStringRef str);
251251
SWIFT_NAME("getter:BridgedStringRef.isEmpty(self:)")
252252
BRIDGED_INLINE bool BridgedStringRef_empty(BridgedStringRef str);
253253

254+
SWIFT_NAME("BridgedStringRef.equals(self:_:)")
255+
BRIDGED_INLINE bool BridgedStringRef_equals(BridgedStringRef lhs,
256+
BridgedStringRef rhs);
257+
254258
class BridgedOwnedString {
255259
char *_Nonnull Data;
256260
size_t Length;

include/swift/Basic/BasicBridgingImpl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ bool BridgedStringRef_empty(BridgedStringRef str) {
7070
return str.unbridged().empty();
7171
}
7272

73+
bool BridgedStringRef_equals(BridgedStringRef lhs, BridgedStringRef rhs) {
74+
return lhs.unbridged() == rhs.unbridged();
75+
}
76+
7377
//===----------------------------------------------------------------------===//
7478
// MARK: BridgedOwnedString
7579
//===----------------------------------------------------------------------===//

lib/AST/Bridging/DeclAttributeBridging.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,8 +559,10 @@ BridgedRawDocCommentAttr_createParsed(BridgedASTContext cContext,
559559
return new (cContext.unbridged()) RawDocCommentAttr(cRange.unbridged());
560560
}
561561

562-
static ReferenceOwnership unbridged(BridgedReferenceOwnership kind) {
562+
ReferenceOwnership unbridged(BridgedReferenceOwnership kind) {
563563
switch (kind) {
564+
case BridgedReferenceOwnershipStrong:
565+
return ReferenceOwnership::Strong;
564566
case BridgedReferenceOwnershipWeak:
565567
return ReferenceOwnership::Weak;
566568
case BridgedReferenceOwnershipUnowned:

lib/AST/Bridging/ExprBridging.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,31 @@ BridgedCallExpr BridgedCallExpr_createParsed(BridgedASTContext cContext,
121121
/*implicit*/ false);
122122
}
123123

124+
BridgedCaptureListEntry BridegedCaptureListEntry_createParsed(
125+
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
126+
BridgedReferenceOwnership cOwnershipKind,
127+
BridgedSourceRange cOwnershipRange, BridgedIdentifier cName,
128+
BridgedSourceLoc cNameLoc, BridgedSourceLoc cEqualLoc,
129+
BridgedExpr cInitializer) {
130+
return CaptureListEntry::createParsed(
131+
cContext.unbridged(), unbridged(cOwnershipKind),
132+
cOwnershipRange.unbridged(), cName.unbridged(), cNameLoc.unbridged(),
133+
cEqualLoc.unbridged(), cInitializer.unbridged(),
134+
cDeclContext.unbridged());
135+
}
136+
137+
BridgedCaptureListExpr
138+
BridgedCaptureListExpr_createParsed(BridgedASTContext cContext,
139+
BridgedArrayRef cCaptureList,
140+
BridgedClosureExpr cClosure) {
141+
SmallVector<CaptureListEntry, 4> captureList;
142+
for (auto e : cCaptureList.unbridged<BridgedCaptureListEntry>())
143+
captureList.push_back(e.unbridged());
144+
145+
return CaptureListExpr::create(cContext.unbridged(), captureList,
146+
cClosure.unbridged());
147+
}
148+
124149
BridgedClosureExpr BridgedClosureExpr_createParsed(
125150
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
126151
BridgedDeclAttributes cAttributes, BridgedSourceRange cBracketRange,

lib/AST/Expr.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,34 @@ CaptureListEntry::CaptureListEntry(PatternBindingDecl *PBD) : PBD(PBD) {
13601360
"Capture lists only support single-var patterns");
13611361
}
13621362

1363+
CaptureListEntry CaptureListEntry::createParsed(
1364+
ASTContext &Ctx, ReferenceOwnership ownershipKind,
1365+
SourceRange ownershipRange, Identifier name, SourceLoc nameLoc,
1366+
SourceLoc equalLoc, Expr *initializer, DeclContext *DC) {
1367+
1368+
auto introducer =
1369+
(ownershipKind != ReferenceOwnership::Weak ? VarDecl::Introducer::Let
1370+
: VarDecl::Introducer::Var);
1371+
auto *VD =
1372+
new (Ctx) VarDecl(/*isStatic==*/false, introducer, nameLoc, name, DC);
1373+
1374+
if (ownershipKind != ReferenceOwnership::Strong)
1375+
VD->getAttrs().add(
1376+
new (Ctx) ReferenceOwnershipAttr(ownershipRange, ownershipKind));
1377+
1378+
auto *pattern = NamedPattern::createImplicit(Ctx, VD);
1379+
1380+
auto *PBD = PatternBindingDecl::create(Ctx, /*StaticLoc=*/SourceLoc(),
1381+
StaticSpellingKind::None, nameLoc,
1382+
pattern, equalLoc, initializer, DC);
1383+
CaptureListEntry CLE(PBD);
1384+
1385+
if (CLE.isSimpleSelfCapture())
1386+
VD->setIsSelfParamCapture();
1387+
1388+
return CLE;
1389+
}
1390+
13631391
VarDecl *CaptureListEntry::getVar() const {
13641392
return PBD->getSingleVar();
13651393
}

lib/ASTGen/Sources/ASTGen/Bridge.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ extension BridgedNullableParameterList: /*@retroactive*/ swiftASTGen.BridgedNull
3838
extension BridgedNullablePatternBindingInitializer: /*@retroactive*/ swiftASTGen.BridgedNullable {}
3939
extension BridgedNullableCustomAttributeInitializer: /*@retroactive*/ swiftASTGen.BridgedNullable {}
4040
extension BridgedNullableArgumentList: /*@retroactive*/ swiftASTGen.BridgedNullable {}
41+
extension BridgedNullableVarDecl: /*@retroactive*/ swiftASTGen.BridgedNullable {}
4142

4243
extension BridgedIdentifier: /*@retroactive*/ Swift.Equatable {
4344
public static func == (lhs: Self, rhs: Self) -> Bool {
@@ -92,6 +93,9 @@ extension BridgedCustomAttributeInitializer: BridgedHasNullable {
9293
extension BridgedArgumentList: BridgedHasNullable {
9394
typealias Nullable = BridgedNullableArgumentList
9495
}
96+
extension BridgedVarDecl: BridgedHasNullable {
97+
typealias Nullable = BridgedNullableVarDecl
98+
}
9599

96100
public extension BridgedSourceLoc {
97101
/// Form a source location at the given absolute position in `buffer`.
@@ -162,6 +166,12 @@ extension BridgedStringRef: /*@retroactive*/ Swift.ExpressibleByStringLiteral {
162166
}
163167
}
164168

169+
extension BridgedStringRef: /*@retroactive*/ Swift.Equatable {
170+
public static func ==(lhs: BridgedStringRef, rhs: BridgedStringRef) -> Bool {
171+
lhs.equals(rhs)
172+
}
173+
}
174+
165175
extension VersionTuple {
166176
var bridged: BridgedVersionTuple {
167177
switch self.components.count {

0 commit comments

Comments
 (0)