Skip to content

Commit 6ea6a31

Browse files
committed
[ASTGen] Generate TopLevelCodeDecl for PatternBindingDecl
* Instead of hoisting VarDecl in the bridging functions, do it in ASTGen. * Introduce `Decl::forEachDeclToHoist` to handle VarDecls in PatternBindingDecl, and EnumElementDecl in EnumCaseDecl. * Intorduce `withBridgedSwiftClosure(closure:call:)` as a callback mechanism between Swift and C++ * In `generate(sourceFile:)`, instead of using `generate(codeBlockItem:)` handle `CodeBlockItemSyntax.Item` manually to handle `TLCD` wrapping and `VarDecl` hoisting. * Make `generate(variableDecl:)` handle TLCD correctly.
1 parent 04b2174 commit 6ea6a31

File tree

16 files changed

+293
-134
lines changed

16 files changed

+293
-134
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,13 @@ SWIFT_NAME("getter:BridgedDeclContext.astContext(self:)")
568568
BRIDGED_INLINE BridgedASTContext
569569
BridgedDeclContext_getASTContext(BridgedDeclContext dc);
570570

571+
SWIFT_NAME("getter:BridgedDeclContext.parentSourceFile(self:)")
572+
BRIDGED_INLINE BridgedSourceFile
573+
BridgedDeclContext_getParentSourceFile(BridgedDeclContext dc);
574+
575+
SWIFT_NAME("getter:BridgedSourceFile.isScriptMode(self:)")
576+
BRIDGED_INLINE bool BridgedSourceFile_isScriptMode(BridgedSourceFile sf);
577+
571578
SWIFT_NAME("BridgedPatternBindingInitializer.create(declContext:)")
572579
BridgedPatternBindingInitializer
573580
BridgedPatternBindingInitializer_create(BridgedDeclContext cDeclContext);
@@ -1143,6 +1150,10 @@ struct BridgedFingerprint;
11431150
SWIFT_NAME("BridgedDecl.attachParsedAttrs(self:_:)")
11441151
void BridgedDecl_attachParsedAttrs(BridgedDecl decl, BridgedDeclAttributes attrs);
11451152

1153+
SWIFT_NAME("BridgedDecl.forEachDeclToHoist(self:_:)")
1154+
void BridgedDecl_forEachDeclToHoist(BridgedDecl decl,
1155+
BridgedSwiftClosure closure);
1156+
11461157
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedStaticSpelling {
11471158
BridgedStaticSpellingNone,
11481159
BridgedStaticSpellingStatic,
@@ -1434,19 +1445,14 @@ BridgedSubscriptDecl BridgedSubscriptDecl_createParsed(
14341445
BridgedParameterList cParamList, BridgedSourceLoc cArrowLoc,
14351446
BridgedTypeRepr returnType);
14361447

1437-
SWIFT_NAME(
1438-
"BridgedTopLevelCodeDecl.createParsed(_:declContext:startLoc:stmt:endLoc:)")
1439-
BridgedTopLevelCodeDecl BridgedTopLevelCodeDecl_createStmt(
1440-
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
1441-
BridgedSourceLoc cStartLoc, BridgedStmt statement,
1442-
BridgedSourceLoc cEndLoc);
1448+
SWIFT_NAME("BridgedTopLevelCodeDecl.create(_:declContext:)")
1449+
BridgedTopLevelCodeDecl
1450+
BridgedTopLevelCodeDecl_create(BridgedASTContext cContext,
1451+
BridgedDeclContext cDeclContext);
14431452

1444-
SWIFT_NAME(
1445-
"BridgedTopLevelCodeDecl.createParsed(_:declContext:startLoc:expr:endLoc:)")
1446-
BridgedTopLevelCodeDecl BridgedTopLevelCodeDecl_createExpr(
1447-
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
1448-
BridgedSourceLoc cStartLoc, BridgedExpr expression,
1449-
BridgedSourceLoc cEndLoc);
1453+
SWIFT_NAME("BridgedTopLevelCodeDecl.setBody(self:body:)")
1454+
void BridgedTopLevelCodeDecl_setBody(BridgedTopLevelCodeDecl cDecl,
1455+
BridgedBraceStmt cBody);
14501456

14511457
SWIFT_NAME("BridgedTopLevelCodeDecl.dump(self:)")
14521458
void BridgedTopLevelCodeDecl_dump(BridgedTopLevelCodeDecl decl);
@@ -2019,6 +2025,12 @@ BridgedBraceStmt BridgedBraceStmt_createParsed(BridgedASTContext cContext,
20192025
BridgedArrayRef elements,
20202026
BridgedSourceLoc cRBLoc);
20212027

2028+
SWIFT_NAME("BridgedBraceStmt.createImplicit(_:lBraceLoc:element:rBraceLoc:)")
2029+
BridgedBraceStmt BridgedBraceStmt_createImplicit(BridgedASTContext cContext,
2030+
BridgedSourceLoc cLBLoc,
2031+
BridgedASTNode element,
2032+
BridgedSourceLoc cRBLoc);
2033+
20222034
SWIFT_NAME("BridgedBreakStmt.createParsed(_:loc:targetName:targetLoc:)")
20232035
BridgedBreakStmt BridgedBreakStmt_createParsed(BridgedDeclContext cDeclContext,
20242036
BridgedSourceLoc cLoc,

include/swift/AST/ASTBridgingImpl.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,19 @@ BridgedASTContext BridgedDeclContext_getASTContext(BridgedDeclContext dc) {
148148
return dc.unbridged()->getASTContext();
149149
}
150150

151+
BridgedSourceFile
152+
BridgedDeclContext_getParentSourceFile(BridgedDeclContext dc) {
153+
return dc.unbridged()->getParentSourceFile();
154+
}
155+
156+
//===----------------------------------------------------------------------===//
157+
// MARK: BridgedSoureFile
158+
//===----------------------------------------------------------------------===//
159+
160+
BRIDGED_INLINE bool BridgedSourceFile_isScriptMode(BridgedSourceFile sf) {
161+
return sf.unbridged()->isScriptMode();
162+
}
163+
151164
//===----------------------------------------------------------------------===//
152165
// MARK: BridgedDeclObj
153166
//===----------------------------------------------------------------------===//

include/swift/AST/Decl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,6 +1516,10 @@ class alignas(1 << DeclAlignInBits) Decl : public ASTAllocated<Decl>, public Swi
15161516
/// Returns true if this declaration has any `@backDeployed` attributes.
15171517
bool hasBackDeployedAttr() const;
15181518

1519+
/// Apply the specified function to decls that should be placed _next_ to
1520+
/// this decl when constructing AST.
1521+
void forEachDeclToHoist(llvm::function_ref<void(Decl *)> callback) const;
1522+
15191523
/// Emit a diagnostic tied to this declaration.
15201524
template<typename ...ArgTypes>
15211525
InFlightDiagnostic diagnose(

include/swift/Basic/BasicBridging.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,18 @@ struct BridgedVersionTuple {
512512
llvm::VersionTuple unbridged() const;
513513
};
514514

515+
//===----------------------------------------------------------------------===//
516+
// MARK: BridgedSwiftClosure
517+
//===----------------------------------------------------------------------===//
518+
519+
/// Wrapping a pointer to a Swift closure `(UnsafeRawPointer?) -> Void`
520+
/// See 'withBridgedSwiftClosure(closure:call:)' in ASTGen.
521+
struct BridgedSwiftClosure {
522+
const void *_Nonnull closure;
523+
524+
BRIDGED_INLINE void operator()(const void *_Nullable);
525+
};
526+
515527
SWIFT_END_NULLABILITY_ANNOTATIONS
516528

517529
#ifndef PURE_BRIDGING_MODE

include/swift/Basic/BasicBridgingImpl.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,14 @@ BridgedSwiftVersion::BridgedSwiftVersion(SwiftInt major, SwiftInt minor)
141141
ASSERT(major == Major && minor == Minor);
142142
}
143143

144+
extern "C" void
145+
swift_ASTGen_bridgedSwiftClosureCall_1(const void *_Nonnull closure,
146+
const void *_Nullable arg1);
147+
148+
void BridgedSwiftClosure::operator()(const void *_Nullable arg1) {
149+
swift_ASTGen_bridgedSwiftClosureCall_1(closure, arg1);
150+
}
151+
144152
SWIFT_END_NULLABILITY_ANNOTATIONS
145153

146154
#endif // SWIFT_BASIC_BASICBRIDGINGIMPL_H

lib/AST/ASTDumper.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2378,6 +2378,15 @@ namespace {
23782378
printFlag(VD->getAttrs().hasAttribute<LazyAttr>(), "lazy",
23792379
DeclModifierColor);
23802380
printStorageImpl(VD);
2381+
printFlag(VD->isSelfParamCapture(), "self_param_capture",
2382+
DeclModifierColor);
2383+
printFlag(VD->isDebuggerVar(), "debugger_var", DeclModifierColor);
2384+
printFlag(VD->isLazyStorageProperty(), "lazy_storage_property",
2385+
DeclModifierColor);
2386+
printFlag(VD->isTopLevelGlobal(), "top_level_global", DeclModifierColor);
2387+
printFlag(VD->isLazyStorageProperty(), "lazy_storage_property",
2388+
DeclModifierColor);
2389+
23812390
printFlag(VD->getAttrs().hasAttribute<KnownToBeLocalAttr>(),
23822391
"known_to_be_local", DeclModifierColor);
23832392
if (auto *nonisolatedAttr =

lib/AST/Bridging/DeclBridging.cpp

Lines changed: 21 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,14 @@ void BridgedDecl_attachParsedAttrs(BridgedDecl decl,
120120
decl.unbridged()->attachParsedAttrs(attrs.unbridged());
121121
}
122122

123+
void BridgedDecl_forEachDeclToHoist(BridgedDecl cDecl,
124+
BridgedSwiftClosure closure) {
125+
cDecl.unbridged()->forEachDeclToHoist([&](Decl *D) {
126+
BridgedDecl bridged(D);
127+
closure(&bridged);
128+
});
129+
}
130+
123131
BridgedAccessorDecl BridgedAccessorDecl_createParsed(
124132
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
125133
BridgedAccessorKind cKind, BridgedAbstractStorageDecl cStorage,
@@ -150,6 +158,7 @@ BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(
150158
VD->attachParsedAttrs(cAttrs.unbridged());
151159
VD->setStatic(isStatic);
152160
VD->setIntroducer(introducer);
161+
VD->setTopLevelGlobal(isa<TopLevelCodeDecl>(declContext));
153162
});
154163

155164
entries.emplace_back(pattern, entry.equalLoc.unbridged(),
@@ -345,32 +354,15 @@ static void setParsedMembers(IterableDeclContext *IDC, BridgedArrayRef cMembers,
345354

346355
Fingerprint fp = cFingerprint.unbridged();
347356

348-
SmallVector<Decl *> members;
349-
for (auto *decl : cMembers.unbridged<Decl *>()) {
350-
members.push_back(decl);
351-
352-
// Add any variables bound to the list of decls.
353-
if (auto *PBD = dyn_cast<PatternBindingDecl>(decl)) {
354-
for (auto idx : range(PBD->getNumPatternEntries())) {
355-
PBD->getPattern(idx)->forEachVariable(
356-
[&](VarDecl *VD) { members.push_back(VD); });
357-
}
358-
}
359-
// Each enum case element is also part of the members list according to the
360-
// legacy parser.
361-
if (auto *ECD = dyn_cast<EnumCaseDecl>(decl)) {
362-
for (auto *EED : ECD->getElements()) {
363-
members.push_back(EED);
364-
}
365-
}
366-
}
357+
ArrayRef<Decl *> members =
358+
ctx.AllocateTransform<Decl *>(cMembers.unbridged<BridgedDecl>(),
359+
[](auto decl) { return decl.unbridged(); });
367360

368361
IDC->setMaybeHasOperatorDeclarations();
369362
IDC->setMaybeHasNestedClassDeclarations();
370363
// FIXME: Split requests. e.g. DeclMembersFingerprintRequest.
371-
ctx.evaluator.cacheOutput(
372-
ParseMembersRequest{IDC},
373-
FingerprintAndMembers{fp, ctx.AllocateCopy(members)});
364+
ctx.evaluator.cacheOutput(ParseMembersRequest{IDC},
365+
FingerprintAndMembers{fp, members});
374366
}
375367

376368
void BridgedNominalTypeDecl_setParsedMembers(BridgedNominalTypeDecl cDecl,
@@ -660,32 +652,15 @@ BridgedSubscriptDecl BridgedSubscriptDecl_createParsed(
660652
cGenericParamList.unbridged());
661653
}
662654

663-
BridgedTopLevelCodeDecl BridgedTopLevelCodeDecl_createStmt(
664-
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
665-
BridgedSourceLoc cStartLoc, BridgedStmt statement,
666-
BridgedSourceLoc cEndLoc) {
667-
ASTContext &context = cContext.unbridged();
668-
DeclContext *declContext = cDeclContext.unbridged();
669-
670-
auto *S = statement.unbridged();
671-
auto Brace = BraceStmt::create(context, cStartLoc.unbridged(), {S},
672-
cEndLoc.unbridged(),
673-
/*Implicit=*/true);
674-
return new (context) TopLevelCodeDecl(declContext, Brace);
655+
BridgedTopLevelCodeDecl
656+
BridgedTopLevelCodeDecl_create(BridgedASTContext cContext,
657+
BridgedDeclContext cDeclContext) {
658+
return new (cContext.unbridged()) TopLevelCodeDecl(cDeclContext.unbridged());
675659
}
676660

677-
BridgedTopLevelCodeDecl BridgedTopLevelCodeDecl_createExpr(
678-
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
679-
BridgedSourceLoc cStartLoc, BridgedExpr expression,
680-
BridgedSourceLoc cEndLoc) {
681-
ASTContext &context = cContext.unbridged();
682-
DeclContext *declContext = cDeclContext.unbridged();
683-
684-
auto *E = expression.unbridged();
685-
auto Brace = BraceStmt::create(context, cStartLoc.unbridged(), {E},
686-
cEndLoc.unbridged(),
687-
/*Implicit=*/true);
688-
return new (context) TopLevelCodeDecl(declContext, Brace);
661+
void BridgedTopLevelCodeDecl_setBody(BridgedTopLevelCodeDecl cDecl,
662+
BridgedBraceStmt cBody) {
663+
cDecl.unbridged()->setBody(cBody.unbridged());
689664
}
690665

691666
BridgedVarDecl BridgedVarDec_createImplicitStringInterpolationVar(

lib/AST/Bridging/StmtBridging.cpp

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -73,35 +73,24 @@ BridgedBraceStmt BridgedBraceStmt_createParsed(BridgedASTContext cContext,
7373
BridgedSourceLoc cLBLoc,
7474
BridgedArrayRef elements,
7575
BridgedSourceLoc cRBLoc) {
76-
llvm::SmallVector<ASTNode, 6> nodes;
77-
for (auto node : elements.unbridged<BridgedASTNode>()) {
78-
if (node.Kind == ASTNodeKindExpr) {
79-
auto expr = (Expr *)node.Raw;
80-
nodes.push_back(expr);
81-
} else if (node.Kind == ASTNodeKindStmt) {
82-
auto stmt = (Stmt *)node.Raw;
83-
nodes.push_back(stmt);
84-
} else {
85-
assert(node.Kind == ASTNodeKindDecl);
86-
auto decl = (Decl *)node.Raw;
87-
nodes.push_back(decl);
88-
89-
// Variable declarations are part of the list on par with pattern binding
90-
// declarations per the legacy parser.
91-
if (auto *bindingDecl = dyn_cast<PatternBindingDecl>(decl)) {
92-
for (auto i : range(bindingDecl->getNumPatternEntries())) {
93-
bindingDecl->getPattern(i)->forEachVariable(
94-
[&nodes](VarDecl *variable) { nodes.push_back(variable); });
95-
}
96-
}
97-
}
98-
}
76+
llvm::SmallVector<ASTNode, 16> nodes;
77+
for (auto node : elements.unbridged<BridgedASTNode>())
78+
nodes.push_back(node.unbridged());
9979

10080
ASTContext &context = cContext.unbridged();
10181
return BraceStmt::create(context, cLBLoc.unbridged(), nodes,
10282
cRBLoc.unbridged());
10383
}
10484

85+
BridgedBraceStmt BridgedBraceStmt_createImplicit(BridgedASTContext cContext,
86+
BridgedSourceLoc cLBLoc,
87+
BridgedASTNode element,
88+
BridgedSourceLoc cRBLoc) {
89+
return BraceStmt::create(cContext.unbridged(), cLBLoc.unbridged(),
90+
{element.unbridged()}, cRBLoc.unbridged(),
91+
/*Implicit=*/true);
92+
}
93+
10594
BridgedBreakStmt BridgedBreakStmt_createParsed(BridgedDeclContext cDeclContext,
10695
BridgedSourceLoc cLoc,
10796
BridgedIdentifier cTargetName,

lib/AST/Decl.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,39 @@ bool Decl::hasBackDeployedAttr() const {
636636
return false;
637637
}
638638

639+
void Decl::forEachDeclToHoist(llvm::function_ref<void(Decl *)> callback) const {
640+
switch (getKind()) {
641+
case DeclKind::TopLevelCode: {
642+
auto *TLCD = cast<TopLevelCodeDecl>(this);
643+
if (TLCD->getBody()) {
644+
for (auto node : TLCD->getBody()->getElements())
645+
if (auto *d = node.dyn_cast<Decl *>())
646+
d->forEachDeclToHoist(callback);
647+
}
648+
break;
649+
}
650+
case DeclKind::PatternBinding: {
651+
auto *PBD = cast<PatternBindingDecl>(this);
652+
// Variable declarations are part of the list on par with pattern binding
653+
// declarations.
654+
for (auto i : range(PBD->getNumPatternEntries())) {
655+
PBD->getPattern(i)->forEachVariable([&](VarDecl *VD) { callback(VD); });
656+
}
657+
break;
658+
}
659+
case DeclKind::EnumCase: {
660+
auto *ECD = cast<EnumCaseDecl>(this);
661+
// Each enum case element is part of the members list.
662+
for (auto *EED : ECD->getElements()) {
663+
callback(EED);
664+
}
665+
break;
666+
}
667+
default:
668+
break;
669+
}
670+
}
671+
639672
llvm::raw_ostream &swift::operator<<(llvm::raw_ostream &OS,
640673
StaticSpellingKind SSK) {
641674
switch (SSK) {

0 commit comments

Comments
 (0)