Skip to content

Commit 20a6f2c

Browse files
authored
Merge pull request #79416 from rintaro/astgen-capturelistexpr
[ASTGen] Generate CaptureListExpr
2 parents 5bfccd0 + 84875d1 commit 20a6f2c

File tree

10 files changed

+214
-48
lines changed

10 files changed

+214
-48
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 37 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;
@@ -221,6 +223,11 @@ class BridgedASTContext {
221223
BRIDGED_INLINE swift::ASTContext &unbridged() const;
222224
};
223225

226+
#define IDENTIFIER_WITH_NAME(Name, _) \
227+
SWIFT_NAME("getter:BridgedASTContext.id_" #Name "(self:)") \
228+
BRIDGED_INLINE BridgedIdentifier BridgedASTContext_id_##Name(BridgedASTContext bridged);
229+
#include "swift/AST/KnownIdentifiers.def"
230+
224231
SWIFT_NAME("getter:BridgedASTContext.raw(self:)")
225232
BRIDGED_INLINE
226233
void * _Nonnull BridgedASTContext_raw(BridgedASTContext bridged);
@@ -1104,11 +1111,14 @@ BridgedRawDocCommentAttr_createParsed(BridgedASTContext cContext,
11041111
BridgedCharSourceRange cRange);
11051112

11061113
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedReferenceOwnership {
1114+
BridgedReferenceOwnershipStrong,
11071115
BridgedReferenceOwnershipWeak,
11081116
BridgedReferenceOwnershipUnowned,
11091117
BridgedReferenceOwnershipUnmanaged,
11101118
};
11111119

1120+
swift::ReferenceOwnership unbridged(BridgedReferenceOwnership kind);
1121+
11121122
SWIFT_NAME("BridgedReferenceOwnershipAttr.createParsed(_:atLoc:range:kind:)")
11131123
BridgedReferenceOwnershipAttr BridgedReferenceOwnershipAttr_createParsed(
11141124
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
@@ -1625,6 +1635,33 @@ BridgedCallExpr BridgedCallExpr_createParsed(BridgedASTContext cContext,
16251635
BridgedExpr fn,
16261636
BridgedArgumentList args);
16271637

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

include/swift/AST/ASTBridgingImpl.h

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

43-
SWIFT_NAME("getter:BridgedIdentifier.isOperator(self:)")
4443
bool BridgedIdentifier_isOperator(const BridgedIdentifier ident) {
4544
return ident.unbridged().isOperator();
4645
}
@@ -118,6 +117,12 @@ BridgedStringRef BridgedASTContext_allocateCopyString(BridgedASTContext bridged,
118117
return bridged.unbridged().AllocateCopy(cStr.unbridged());
119118
}
120119

120+
#define IDENTIFIER_WITH_NAME(Name, _) \
121+
BridgedIdentifier BridgedASTContext_id_##Name(BridgedASTContext bridged) { \
122+
return bridged.unbridged().Id_##Name; \
123+
}
124+
#include "swift/AST/KnownIdentifiers.def"
125+
121126
//===----------------------------------------------------------------------===//
122127
// MARK: BridgedDeclContext
123128
//===----------------------------------------------------------------------===//
@@ -629,6 +634,20 @@ swift::StmtConditionElement BridgedStmtConditionElement::unbridged() const {
629634
return swift::StmtConditionElement::fromOpaqueValue(Raw);
630635
}
631636

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

633652
SWIFT_END_NULLABILITY_ANNOTATIONS
634653

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
};

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: 4 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`.

0 commit comments

Comments
 (0)