Skip to content

Commit b183462

Browse files
committed
[ASTGen] Transform @_inheritActorContext into a custom attribute with an optional modifier
1 parent 8b300cc commit b183462

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed

include/swift/AST/ASTBridging.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,6 +1241,18 @@ BridgedNonisolatedAttr_createParsed(BridgedASTContext cContext,
12411241
BridgedSourceRange cRange,
12421242
BridgedNonIsolatedModifier modifier);
12431243

1244+
enum ENUM_EXTENSIBILITY_ATTR(closed) BridgedInheritActorContextModifier {
1245+
BridgedInheritActorContextModifierNone,
1246+
BridgedInheritActorContextModifierAlways,
1247+
};
1248+
1249+
SWIFT_NAME("BridgedInheritActorContextAttr.createParsed(_:atLoc:range:modifier:)")
1250+
BridgedInheritActorContextAttr
1251+
BridgedInheritActorContextAttr_createParsed(BridgedASTContext cContext,
1252+
BridgedSourceLoc cAtLoc,
1253+
BridgedSourceRange cRange,
1254+
BridgedInheritActorContextModifier modifier);
1255+
12441256
SWIFT_NAME("BridgedObjCAttr.createParsedUnnamed(_:atLoc:attrNameLoc:)")
12451257
BridgedObjCAttr
12461258
BridgedObjCAttr_createParsedUnnamed(BridgedASTContext cContext,

lib/AST/Bridging/DeclAttributeBridging.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,25 @@ BridgedNonisolatedAttr_createParsed(BridgedASTContext cContext,
649649
/*implicit=*/false);
650650
}
651651

652+
static InheritActorContextModifier
653+
unbridged(BridgedInheritActorContextModifier modifier) {
654+
switch (modifier) {
655+
case BridgedInheritActorContextModifierNone:
656+
return InheritActorContextModifier::None;
657+
case BridgedInheritActorContextModifierAlways:
658+
return InheritActorContextModifier::Always;
659+
}
660+
llvm_unreachable("unhandled enum value");
661+
}
662+
663+
BridgedInheritActorContextAttr BridgedInheritActorContextAttr_createParsed(
664+
BridgedASTContext cContext, BridgedSourceLoc cAtLoc,
665+
BridgedSourceRange cRange, BridgedInheritActorContextModifier modifier) {
666+
return new (cContext.unbridged()) InheritActorContextAttr(
667+
cAtLoc.unbridged(), cRange.unbridged(), unbridged(modifier),
668+
/*implicit=*/false);
669+
}
670+
652671
BridgedObjCAttr
653672
BridgedObjCAttr_createParsedUnnamed(BridgedASTContext cContext,
654673
BridgedSourceLoc cAtLoc,

lib/ASTGen/Sources/ASTGen/DeclAttrs.swift

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,6 @@ extension ASTGenVisitor {
249249
.ibSegueAction,
250250
.implementationOnly,
251251
.implicitSelfCapture,
252-
.inheritActorContext,
253252
.inheritsConvenienceInitializers,
254253
.inlinable,
255254
.isolated,
@@ -312,6 +311,9 @@ extension ASTGenVisitor {
312311
case .referenceOwnership:
313312
// TODO: Diagnose.
314313
return handle(self.generateReferenceOwnershipAttr(attribute: node, attrName: attrName)?.asDeclAttribute)
314+
case .inheritActorContext:
315+
return handle(self.generateInheritActorContextAttr(attribute: node)?.asDeclAttribute)
316+
315317
case .async,
316318
.consuming,
317319
.borrowing,
@@ -1411,6 +1413,28 @@ extension ASTGenVisitor {
14111413
)
14121414
}
14131415

1416+
func generateInheritActorContextAttr(attribute node: AttributeSyntax) -> BridgedInheritActorContextAttr? {
1417+
let modifier: BridgedInheritActorContextModifier? = self.generateSingleAttrOption(
1418+
attribute: node,
1419+
{
1420+
switch $0.rawText {
1421+
case "always": return .always
1422+
default: return nil
1423+
}
1424+
},
1425+
valueIfOmitted: BridgedInheritActorContextModifier.none
1426+
)
1427+
guard let modifier else {
1428+
return nil
1429+
}
1430+
return .createParsed(
1431+
self.ctx,
1432+
atLoc: self.generateSourceLoc(node.atSign),
1433+
range: self.generateAttrSourceRange(node),
1434+
modifier: modifier
1435+
)
1436+
}
1437+
14141438
/// E.g.:
14151439
/// ```
14161440
/// @objc

test/ASTGen/attrs.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,6 @@ struct LayoutOuter {
256256
struct AnyEraser: EraserProto {
257257
init<T: EraserProto>(erasing: T) {}
258258
}
259+
260+
func takeNone(@_inheritActorContext param: () async -> ()) { }
261+
func takeAlways(@_inheritActorContext(always) param: () async -> ()) { }

0 commit comments

Comments
 (0)