[ASTGen] Transform @_inheritActorContext into a custom attribute with an optional modifier

This commit is contained in:
Pavel Yaskevich
2025-05-12 14:01:36 -07:00
parent c050e8f75a
commit c0aca5384b
4 changed files with 59 additions and 1 deletions

View File

@@ -1254,6 +1254,18 @@ BridgedNonisolatedAttr_createParsed(BridgedASTContext cContext,
BridgedSourceRange cRange,
BridgedNonIsolatedModifier modifier);
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedInheritActorContextModifier {
BridgedInheritActorContextModifierNone,
BridgedInheritActorContextModifierAlways,
};
SWIFT_NAME("BridgedInheritActorContextAttr.createParsed(_:atLoc:range:modifier:)")
BridgedInheritActorContextAttr
BridgedInheritActorContextAttr_createParsed(BridgedASTContext cContext,
BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange,
BridgedInheritActorContextModifier modifier);
SWIFT_NAME("BridgedObjCAttr.createParsedUnnamed(_:atLoc:attrNameLoc:)")
BridgedObjCAttr
BridgedObjCAttr_createParsedUnnamed(BridgedASTContext cContext,

View File

@@ -649,6 +649,25 @@ BridgedNonisolatedAttr_createParsed(BridgedASTContext cContext,
/*implicit=*/false);
}
static InheritActorContextModifier
unbridged(BridgedInheritActorContextModifier modifier) {
switch (modifier) {
case BridgedInheritActorContextModifierNone:
return InheritActorContextModifier::None;
case BridgedInheritActorContextModifierAlways:
return InheritActorContextModifier::Always;
}
llvm_unreachable("unhandled enum value");
}
BridgedInheritActorContextAttr BridgedInheritActorContextAttr_createParsed(
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
BridgedSourceRange cRange, BridgedInheritActorContextModifier modifier) {
return new (cContext.unbridged()) InheritActorContextAttr(
cAtLoc.unbridged(), cRange.unbridged(), unbridged(modifier),
/*implicit=*/false);
}
BridgedObjCAttr
BridgedObjCAttr_createParsedUnnamed(BridgedASTContext cContext,
BridgedSourceLoc cAtLoc,

View File

@@ -249,7 +249,6 @@ extension ASTGenVisitor {
.ibSegueAction,
.implementationOnly,
.implicitSelfCapture,
.inheritActorContext,
.inheritsConvenienceInitializers,
.inlinable,
.isolated,
@@ -312,6 +311,9 @@ extension ASTGenVisitor {
case .referenceOwnership:
// TODO: Diagnose.
return handle(self.generateReferenceOwnershipAttr(attribute: node, attrName: attrName)?.asDeclAttribute)
case .inheritActorContext:
return handle(self.generateInheritActorContextAttr(attribute: node)?.asDeclAttribute)
case .async,
.consuming,
.borrowing,
@@ -1411,6 +1413,28 @@ extension ASTGenVisitor {
)
}
func generateInheritActorContextAttr(attribute node: AttributeSyntax) -> BridgedInheritActorContextAttr? {
let modifier: BridgedInheritActorContextModifier? = self.generateSingleAttrOption(
attribute: node,
{
switch $0.rawText {
case "always": return .always
default: return nil
}
},
valueIfOmitted: BridgedInheritActorContextModifier.none
)
guard let modifier else {
return nil
}
return .createParsed(
self.ctx,
atLoc: self.generateSourceLoc(node.atSign),
range: self.generateAttrSourceRange(node),
modifier: modifier
)
}
/// E.g.:
/// ```
/// @objc

View File

@@ -256,3 +256,6 @@ struct LayoutOuter {
struct AnyEraser: EraserProto {
init<T: EraserProto>(erasing: T) {}
}
func takeNone(@_inheritActorContext param: () async -> ()) { }
func takeAlways(@_inheritActorContext(always) param: () async -> ()) { }