Skip to content

[ASTGen] Generate anonymous closure parameters #79232

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions include/swift/AST/ASTBridging.h
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,10 @@ SWIFT_NAME("BridgedASTContext.getIdentifier(self:_:)")
BridgedIdentifier BridgedASTContext_getIdentifier(BridgedASTContext cContext,
BridgedStringRef cStr);

SWIFT_NAME("BridgedASTContext.getDollarIdentifier(self:_:)")
BridgedIdentifier
BridgedASTContext_getDollarIdentifier(BridgedASTContext cContext, size_t idx);

SWIFT_NAME("BridgedASTContext.langOptsHasFeature(self:_:)")
bool BridgedASTContext_langOptsHasFeature(BridgedASTContext cContext,
BridgedFeature feature);
Expand Down Expand Up @@ -552,6 +556,13 @@ SWIFT_NAME("getter:BridgedDeclContext.isModuleScopeContext(self:)")
BRIDGED_INLINE bool
BridgedDeclContext_isModuleScopeContext(BridgedDeclContext dc);

SWIFT_NAME("getter:BridgedDeclContext.isClosureExpr(self:)")
BRIDGED_INLINE bool BridgedDeclContext_isClosureExpr(BridgedDeclContext dc);

SWIFT_NAME("BridgedDeclContext.castToClosureExpr(self:)")
BRIDGED_INLINE BridgedClosureExpr
BridgedDeclContext_castToClosureExpr(BridgedDeclContext dc);

SWIFT_NAME("getter:BridgedDeclContext.astContext(self:)")
BRIDGED_INLINE BridgedASTContext
BridgedDeclContext_getASTContext(BridgedDeclContext dc);
Expand Down Expand Up @@ -1173,6 +1184,9 @@ BRIDGED_INLINE void
BridgedParamDecl_setSpecifier(BridgedParamDecl cDecl,
BridgedParamSpecifier cSpecifier);

SWIFT_NAME("BridgedParamDecl.setImplicit(self:)")
BRIDGED_INLINE void BridgedParamDecl_setImplicit(BridgedParamDecl cDecl);

SWIFT_NAME("BridgedConstructorDecl.setParsedBody(self:_:)")
void BridgedConstructorDecl_setParsedBody(BridgedConstructorDecl decl,
BridgedBraceStmt body);
Expand Down Expand Up @@ -1575,10 +1589,17 @@ BridgedClosureExpr BridgedClosureExpr_createParsed(
BridgedSourceLoc cArrowLoc, BridgedNullableTypeRepr cExplicitResultType,
BridgedSourceLoc cInLoc);

SWIFT_NAME("BridgedClosureExpr.getParameterList(self:)")
BridgedParameterList
BridgedClosureExpr_getParameterList(BridgedClosureExpr cClosure);

SWIFT_NAME("BridgedClosureExpr.setParameterList(self:_:)")
void BridgedClosureExpr_setParameterList(BridgedClosureExpr cClosure,
BridgedParameterList cParams);

SWIFT_NAME("getter:BridgedClosureExpr.hasAnonymousClosureVars(self:)")
bool BridgedClosureExpr_hasAnonymousClosureVars(BridgedClosureExpr cClosure);

SWIFT_NAME("BridgedClosureExpr.setHasAnonymousClosureVars(self:)")
void BridgedClosureExpr_setHasAnonymousClosureVars(BridgedClosureExpr cClosure);

Expand Down Expand Up @@ -2477,6 +2498,13 @@ BridgedParameterList BridgedParameterList_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cLeftParenLoc,
BridgedArrayRef cParameters, BridgedSourceLoc cRightParenLoc);

SWIFT_NAME("getter:BridgedParameterList.size(self:)")
size_t BridgedParameterList_size(BridgedParameterList cParameterList);

SWIFT_NAME("BridgedParameterList.get(self:_:)")
BridgedParamDecl BridgedParameterList_get(BridgedParameterList cParameterList,
size_t i);

struct BridgedASTType {
swift::TypeBase * _Nullable type;

Expand Down
14 changes: 14 additions & 0 deletions include/swift/AST/ASTBridgingImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,16 @@ bool BridgedDeclContext_isModuleScopeContext(BridgedDeclContext dc) {
return dc.unbridged()->isModuleScopeContext();
}

bool BridgedDeclContext_isClosureExpr(BridgedDeclContext dc) {
return llvm::isa_and_present<swift::ClosureExpr>(
llvm::dyn_cast<swift::AbstractClosureExpr>(dc.unbridged()));
Comment on lines +138 to +139
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe you should be able to directly check for ClosureExpr since that implements classof for DeclContext

}

BridgedClosureExpr BridgedDeclContext_castToClosureExpr(BridgedDeclContext dc) {
return llvm::cast<swift::ClosureExpr>(
llvm::cast<swift::AbstractClosureExpr>(dc.unbridged()));
Comment on lines +143 to +144
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same

}

BridgedASTContext BridgedDeclContext_getASTContext(BridgedDeclContext dc) {
return dc.unbridged()->getASTContext();
}
Expand Down Expand Up @@ -270,6 +280,10 @@ void BridgedParamDecl_setSpecifier(BridgedParamDecl cDecl,
cDecl.unbridged()->setSpecifier(unbridge(cSpecifier));
}

void BridgedParamDecl_setImplicit(BridgedParamDecl cDecl) {
cDecl.unbridged()->setImplicit();
}

//===----------------------------------------------------------------------===//
// MARK: BridgedSubscriptDecl
//===----------------------------------------------------------------------===//
Expand Down
4 changes: 4 additions & 0 deletions include/swift/AST/ASTContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,10 @@ class ASTContext final {
/// specified string.
Identifier getIdentifier(StringRef Str) const;

/// getDollarIdentifier - Return the uniqued and AST-Context-owned version of
/// anonymous closure parameter (e.g. '$1') name by the index.
Identifier getDollarIdentifier(size_t Idx) const;

/// Convert a given alias map to a map of Identifiers between module aliases and their actual names.
/// For example, if '-module-alias Foo=X -module-alias Bar=Y' input is passed in, the aliases Foo and Bar are
/// the names of the imported or referenced modules in source files in the main module, and X and Y
Expand Down
6 changes: 6 additions & 0 deletions lib/AST/ASTContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -971,6 +971,12 @@ Identifier ASTContext::getIdentifier(StringRef Str) const {
return Identifier(I->getKeyData());
}

Identifier ASTContext::getDollarIdentifier(size_t Idx) const {
SmallVector<char, 4> StrBuf;
StringRef varName = ("$" + Twine(Idx)).toStringRef(StrBuf);
return getIdentifier(varName);
}

void ASTContext::lookupInModule(
ModuleDecl *M,
StringRef name,
Expand Down
5 changes: 5 additions & 0 deletions lib/AST/Bridging/ASTContextBridging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ BridgedIdentifier BridgedASTContext_getIdentifier(BridgedASTContext cContext,
return cContext.unbridged().getIdentifier(cStr.unbridged());
}

BridgedIdentifier
BridgedASTContext_getDollarIdentifier(BridgedASTContext cContext, size_t idx) {
return cContext.unbridged().getDollarIdentifier(idx);
}

bool BridgedASTContext_langOptsHasFeature(BridgedASTContext cContext,
BridgedFeature feature) {
return cContext.unbridged().LangOpts.hasFeature((Feature)feature);
Expand Down
13 changes: 13 additions & 0 deletions lib/AST/Bridging/DeclBridging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,10 @@ bool BridgedNominalTypeDecl_isStructWithUnreferenceableStorage(
return false;
}

//===----------------------------------------------------------------------===//
// MARK: BridgedParameterList
//===----------------------------------------------------------------------===//

BridgedParameterList BridgedParameterList_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cLeftParenLoc,
BridgedArrayRef cParameters, BridgedSourceLoc cRightParenLoc) {
Expand All @@ -736,3 +740,12 @@ BridgedParameterList BridgedParameterList_createParsed(
cParameters.unbridged<ParamDecl *>(),
cRightParenLoc.unbridged());
}

size_t BridgedParameterList_size(BridgedParameterList cParameterList) {
return cParameterList.unbridged()->size();
}

BridgedParamDecl BridgedParameterList_get(BridgedParameterList cParameterList,
size_t i) {
return cParameterList.unbridged()->get(i);
}
9 changes: 9 additions & 0 deletions lib/AST/Bridging/ExprBridging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,11 +146,20 @@ BridgedClosureExpr BridgedClosureExpr_createParsed(
declContext);
}

BridgedParameterList
BridgedClosureExpr_getParameterList(BridgedClosureExpr cClosure) {
return cClosure.unbridged()->getParameters();
}

void BridgedClosureExpr_setParameterList(BridgedClosureExpr cClosure,
BridgedParameterList cParams) {
cClosure.unbridged()->setParameterList(cParams.unbridged());
}

bool BridgedClosureExpr_hasAnonymousClosureVars(BridgedClosureExpr cClosure) {
return cClosure.unbridged()->hasAnonymousClosureVars();
}

void BridgedClosureExpr_setHasAnonymousClosureVars(
BridgedClosureExpr cClosure) {
cClosure.unbridged()->setHasAnonymousClosureVars();
Expand Down
Loading