Skip to content

[ASTGen] Generate several attributes #77905

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
Dec 6, 2024
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
50 changes: 47 additions & 3 deletions include/swift/AST/ASTBridging.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ inline const void *_Nullable BridgedIdentifier_raw(BridgedIdentifier ident) {
return ident.Raw;
}

SWIFT_NAME("getter:BridgedIdentifier.isOperator(self:)")
BRIDGED_INLINE bool BridgedIdentifier_isOperator(const BridgedIdentifier);

struct BridgedLocatedIdentifier {
SWIFT_NAME("name")
BridgedIdentifier Name;
Expand Down Expand Up @@ -576,6 +579,7 @@ enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedAccessLevel {
BridgedAccessLevelPackage,
BridgedAccessLevelPublic,
BridgedAccessLevelOpen,
BridgedAccessLevelNone,
};

SWIFT_NAME("BridgedAccessControlAttr.createParsed(_:range:accessLevel:)")
Expand Down Expand Up @@ -612,6 +616,13 @@ BridgedCustomAttr BridgedCustomAttr_createParsed(
BridgedNullablePatternBindingInitializer cInitContext,
BridgedNullableArgumentList cArgumentList);

SWIFT_NAME("BridgedDocumentationAttr.createParsed(_:atLoc:range:metadata:"
"accessLevel:)")
BridgedDocumentationAttr BridgedDocumentationAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedStringRef cMetadata,
BridgedAccessLevel cAccessLevel);

SWIFT_NAME(
"BridgedDynamicReplacementAttr.createParsed(_:atLoc:attrNameLoc:lParenLoc:"
"replacedFunction:rParenLoc:)")
Expand Down Expand Up @@ -739,6 +750,13 @@ BridgedMacroRoleAttr BridgedMacroRoleAttr_createParsed(
BridgedSourceLoc cLParenLoc, BridgedMacroRole cRole, BridgedArrayRef cNames,
BridgedArrayRef cConformances, BridgedSourceLoc cRParenLoc);

SWIFT_NAME("BridgedStorageRestrictionsAttr.createParsed(_:atLoc:range:"
"initializes:accesses:)")
BridgedStorageRestrictionsAttr BridgedStorageRestrictionsAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedArrayRef cInitializes,
BridgedArrayRef cAccesses);

SWIFT_NAME(
"BridgedSwiftNativeObjCRuntimeBaseAttr.createParsed(_:atLoc:range:name:)")
BridgedSwiftNativeObjCRuntimeBaseAttr
Expand All @@ -757,6 +775,12 @@ BridgedNonSendableAttr BridgedNonSendableAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedNonSendableKind cKind);

SWIFT_NAME("BridgedNonisolatedAttr.createParsed(_:atLoc:range:isUnsafe:)")
BridgedNonisolatedAttr
BridgedNonisolatedAttr_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, bool isUnsafe);

SWIFT_NAME("BridgedObjCAttr.createParsedUnnamed(_:atLoc:attrNameLoc:)")
BridgedObjCAttr
BridgedObjCAttr_createParsedUnnamed(BridgedASTContext cContext,
Expand Down Expand Up @@ -848,6 +872,20 @@ BridgedSetterAccessAttr_createParsed(BridgedASTContext cContext,
BridgedSourceRange cRange,
BridgedAccessLevel cAccessLevel);

enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedSpecializationKind : uint8_t {
BridgedSpecializationKindFull,
BridgedSpecializationKindPartial,
};

SWIFT_NAME("BridgedSpecializeAttr.createParsed(_:atLoc:range:whereClause:"
"exported:kind:taretFunction:spiGroups:availableAttrs:)")
BridgedSpecializeAttr BridgedSpecializeAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedNullableTrailingWhereClause cWhereClause,
bool exported, BridgedSpecializationKind cKind,
BridgedDeclNameRef cTargetFunction, BridgedArrayRef cSPIGroups,
BridgedArrayRef cAvailableAttrs);

SWIFT_NAME(
"BridgedSPIAccessControlAttr.createParsed(_:atLoc:range:spiGroupName:)")
BridgedSPIAccessControlAttr BridgedSPIAccessControlAttr_createParsed(
Expand All @@ -859,6 +897,12 @@ BridgedSILGenNameAttr BridgedSILGenNameAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedStringRef cName, bool isRaw);

SWIFT_NAME(
"BridgedUnavailableFromAsyncAttr.createParsed(_:atLoc:range:message:)")
BridgedUnavailableFromAsyncAttr BridgedUnavailableFromAsyncAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedStringRef cMessage);

//===----------------------------------------------------------------------===//
// MARK: Decls
//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -895,11 +939,11 @@ BridgedAccessorDecl BridgedAccessorDecl_createParsed(

SWIFT_NAME(
"BridgedPatternBindingDecl.createParsed(_:declContext:bindingKeywordLoc:"
"entries:isStatic:isLet:)")
"entries:attributes:isStatic:isLet:)")
BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
BridgedSourceLoc cBindingKeywordLoc, BridgedArrayRef cBindingEntries,
bool isStatic, bool isLet);
BridgedSourceLoc cBindingKeywordLoc, BridgedArrayRef cBindingEntries, BridgedDeclAttributes cAttrs,
bool isStatic, bool isLet);

SWIFT_NAME("BridgedParamDecl.createParsed(_:declContext:specifierLoc:argName:"
"argNameLoc:paramName:paramNameLoc:type:defaultValue:)")
Expand Down
5 changes: 5 additions & 0 deletions include/swift/AST/ASTBridgingImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ swift::Identifier BridgedIdentifier::unbridged() const {
return swift::Identifier::getFromOpaquePointer(Raw);
}

SWIFT_NAME("getter:BridgedIdentifier.isOperator(self:)")
bool BridgedIdentifier_isOperator(const BridgedIdentifier ident) {
return ident.unbridged().isOperator();
}

//===----------------------------------------------------------------------===//
// MARK: BridgedDeclBaseName
//===----------------------------------------------------------------------===//
Expand Down
1 change: 0 additions & 1 deletion include/swift/AST/Attr.h
Original file line number Diff line number Diff line change
Expand Up @@ -1560,7 +1560,6 @@ class SpecializeAttr final
TrailingWhereClause *clause, bool exported, SpecializationKind kind,
DeclNameRef targetFunctionName, ArrayRef<Identifier> spiGroups,
ArrayRef<AvailableAttr *> availabilityAttrs,
size_t typeErasedParamsCount,
GenericSignature specializedSignature = nullptr);

static SpecializeAttr *create(ASTContext &ctx, bool exported,
Expand Down
1 change: 0 additions & 1 deletion include/swift/Parse/Parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -1083,7 +1083,6 @@ class Parser {
AvailabilityRange *SILAvailability,
SmallVectorImpl<Identifier> &spiGroups,
SmallVectorImpl<AvailableAttr *> &availableAttrs,
size_t &typeErasedParamsCount,
llvm::function_ref<bool(Parser &)> parseSILTargetName,
llvm::function_ref<bool(Parser &)> parseSILSIPModule);

Expand Down
1 change: 1 addition & 0 deletions lib/AST/ASTDumper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1594,6 +1594,7 @@ namespace {

void visitPatternBindingDecl(PatternBindingDecl *PBD, StringRef label) {
printCommon(PBD, "pattern_binding_decl", label);
printAttributes(PBD);

for (auto idx : range(PBD->getNumPatternEntries())) {
printRec(PBD->getPattern(idx));
Expand Down
18 changes: 17 additions & 1 deletion lib/AST/Attr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2249,11 +2249,27 @@ SpecializeAttr *SpecializeAttr::create(ASTContext &Ctx, SourceLoc atLoc,
DeclNameRef targetFunctionName,
ArrayRef<Identifier> spiGroups,
ArrayRef<AvailableAttr *> availableAttrs,
size_t typeErasedParamsCount,
GenericSignature specializedSignature) {
size_t typeErasedParamsCount = 0;
if (Ctx.LangOpts.hasFeature(Feature::LayoutPrespecialization)) {
if (clause != nullptr) {
for (auto &req : clause->getRequirements()) {
if (req.getKind() == RequirementReprKind::LayoutConstraint) {
if (auto *attributedTy =
dyn_cast<AttributedTypeRepr>(req.getSubjectRepr())) {
if (attributedTy->has(TypeAttrKind::NoMetadata)) {
typeErasedParamsCount += 1;
}
}
}
}
}
}

unsigned size = totalSizeToAlloc<Identifier, AvailableAttr *, Type>(
spiGroups.size(), availableAttrs.size(), typeErasedParamsCount);
void *mem = Ctx.Allocate(size, alignof(SpecializeAttr));

return new (mem)
SpecializeAttr(atLoc, range, clause, exported, kind, specializedSignature,
targetFunctionName, spiGroups, availableAttrs, typeErasedParamsCount);
Expand Down
83 changes: 79 additions & 4 deletions lib/AST/Bridging/DeclAttributeBridging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ void BridgedDeclAttributes_add(BridgedDeclAttributes *cAttrs,
*cAttrs = attrs;
}

static AccessLevel unbridged(BridgedAccessLevel level) {
static std::optional<AccessLevel> unbridge(BridgedAccessLevel level) {
switch (level) {
case BridgedAccessLevelPrivate:
return AccessLevel::Private;
Expand All @@ -87,6 +87,8 @@ static AccessLevel unbridged(BridgedAccessLevel level) {
return AccessLevel::Public;
case BridgedAccessLevelOpen:
return AccessLevel::Open;
case BridgedAccessLevelNone:
return std::nullopt;
}
llvm_unreachable("unhandled BridgedAccessLevel");
}
Expand All @@ -96,7 +98,7 @@ BridgedAccessControlAttr_createParsed(BridgedASTContext cContext,
BridgedSourceRange cRange,
BridgedAccessLevel cAccessLevel) {
return new (cContext.unbridged()) AccessControlAttr(
/*atLoc=*/{}, cRange.unbridged(), unbridged(cAccessLevel));
/*atLoc=*/{}, cRange.unbridged(), unbridge(cAccessLevel).value());
}

BridgedAlignmentAttr
Expand Down Expand Up @@ -150,6 +152,15 @@ BridgedDynamicReplacementAttr BridgedDynamicReplacementAttr_createParsed(
cRParenLoc.unbridged());
}

BridgedDocumentationAttr BridgedDocumentationAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedStringRef cMetadata,
BridgedAccessLevel cAccessLevel) {
return new (cContext.unbridged()) DocumentationAttr(
cAtLoc.unbridged(), cRange.unbridged(), cMetadata.unbridged(),
unbridge(cAccessLevel), /*implicit=*/false);
}

static EffectsKind unbridged(BridgedEffectsKind kind) {
switch (kind) {
case BridgedEffectsKindReadNone:
Expand Down Expand Up @@ -315,6 +326,25 @@ BridgedMacroRoleAttr BridgedMacroRoleAttr_createParsed(
conformances, cRParenLoc.unbridged(), /*implicit=*/false);
}

BridgedStorageRestrictionsAttr BridgedStorageRestrictionsAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedArrayRef cInitializes,
BridgedArrayRef cAccesses) {
ASTContext &context = cContext.unbridged();

ArrayRef<Identifier> initializes =
cContext.unbridged().AllocateTransform<Identifier>(
cInitializes.unbridged<BridgedIdentifier>(),
[](auto &e) { return e.unbridged(); });
ArrayRef<Identifier> accesses =
cContext.unbridged().AllocateTransform<Identifier>(
cAccesses.unbridged<BridgedIdentifier>(),
[](auto &e) { return e.unbridged(); });

return StorageRestrictionsAttr::create(
context, cAtLoc.unbridged(), cRange.unbridged(), initializes, accesses);
}

BridgedSwiftNativeObjCRuntimeBaseAttr
BridgedSwiftNativeObjCRuntimeBaseAttr_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cAtLoc,
Expand Down Expand Up @@ -342,6 +372,14 @@ BridgedNonSendableAttr BridgedNonSendableAttr_createParsed(
NonSendableAttr(cAtLoc.unbridged(), cRange.unbridged(), unbridged(cKind));
}

BridgedNonisolatedAttr
BridgedNonisolatedAttr_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, bool isUnsafe) {
return new (cContext.unbridged()) NonisolatedAttr(
cAtLoc.unbridged(), cRange.unbridged(), isUnsafe, /*implicit=*/false);
}

BridgedObjCAttr
BridgedObjCAttr_createParsedUnnamed(BridgedASTContext cContext,
BridgedSourceLoc cAtLoc,
Expand Down Expand Up @@ -375,7 +413,7 @@ BridgedObjCAttr BridgedObjCAttr_createParsedSelector(

return ObjCAttr::createSelector(
cContext.unbridged(), cAtLoc.unbridged(), cAttrNameLoc.unbridged(),
cLParenLoc.unbridged(), nameLocs, names, cLParenLoc.unbridged());
cLParenLoc.unbridged(), nameLocs, names, cRParenLoc.unbridged());
}

BridgedObjCImplementationAttr BridgedObjCImplementationAttr_createParsed(
Expand Down Expand Up @@ -480,7 +518,37 @@ BridgedSetterAccessAttr_createParsed(BridgedASTContext cContext,
BridgedSourceRange cRange,
BridgedAccessLevel cAccessLevel) {
return new (cContext.unbridged()) SetterAccessAttr(
/*atLoc=*/{}, cRange.unbridged(), unbridged(cAccessLevel));
/*atLoc=*/{}, cRange.unbridged(), unbridge(cAccessLevel).value());
}

static SpecializeAttr::SpecializationKind
unbridge(BridgedSpecializationKind kind) {
switch (kind) {
case BridgedSpecializationKindFull:
return SpecializeAttr::SpecializationKind::Full;
case BridgedSpecializationKindPartial:
return SpecializeAttr::SpecializationKind::Partial;
}
llvm_unreachable("unhandled kind");
}

BridgedSpecializeAttr BridgedSpecializeAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedNullableTrailingWhereClause cWhereClause,
bool exported, BridgedSpecializationKind cKind,
BridgedDeclNameRef cTargetFunction, BridgedArrayRef cSPIGroups,
BridgedArrayRef cAvailableAttrs) {
SmallVector<Identifier, 2> spiGroups;
for (auto bridging : cSPIGroups.unbridged<BridgedIdentifier>())
spiGroups.push_back(bridging.unbridged());
SmallVector<AvailableAttr *, 2> availableAttrs;
for (auto bridging : cAvailableAttrs.unbridged<BridgedAvailableAttr>())
availableAttrs.push_back(bridging.unbridged());

return SpecializeAttr::create(
cContext.unbridged(), cAtLoc.unbridged(), cRange.unbridged(),
cWhereClause.unbridged(), exported, unbridge(cKind),
cTargetFunction.unbridged(), spiGroups, availableAttrs);
}

BridgedSPIAccessControlAttr BridgedSPIAccessControlAttr_createParsed(
Expand All @@ -500,3 +568,10 @@ BridgedSILGenNameAttr BridgedSILGenNameAttr_createParsed(
cRange.unbridged(), /*Implicit=*/false);
}

BridgedUnavailableFromAsyncAttr BridgedUnavailableFromAsyncAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedStringRef cMessage) {
return new (cContext.unbridged())
UnavailableFromAsyncAttr(cMessage.unbridged(), cAtLoc.unbridged(),
cRange.unbridged(), /*implicit=*/false);
}
4 changes: 2 additions & 2 deletions lib/AST/Bridging/DeclBridging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,7 @@ BridgedAccessorDecl BridgedAccessorDecl_createParsed(

BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(
BridgedASTContext cContext, BridgedDeclContext cDeclContext,
BridgedSourceLoc cBindingKeywordLoc, BridgedArrayRef cBindingEntries,
bool isStatic, bool isLet) {
BridgedSourceLoc cBindingKeywordLoc, BridgedArrayRef cBindingEntries, BridgedDeclAttributes cAttrs, bool isStatic, bool isLet) {
ASTContext &context = cContext.unbridged();
DeclContext *declContext = cDeclContext.unbridged();

Expand All @@ -147,6 +146,7 @@ BridgedPatternBindingDecl BridgedPatternBindingDecl_createParsed(

// Configure all vars.
pattern->forEachVariable([&](VarDecl *VD) {
VD->getAttrs() = cAttrs.unbridged();
VD->setStatic(isStatic);
VD->setIntroducer(introducer);
});
Expand Down
Loading